/ / odejmuj dwa ciągi w wierszu dplyr dla R-R, dplyr

odjąć dwa ciągi w wierszu dplyr dla R-ramek danych r, dplyr

Mają dwie kolumny i potrzebują trzeciej odejmującej dwa przy użyciu dplyr. Bardzo prosty przykład ze względu na przejrzystość. Rozdzielenie / oddzielne podejście jest nieważne w moim przypadku.

 x <- c("FRANCE","GERMANY","RUSSIA")
y <- c("Paris FRANCE", "Berlin GERMANY", "Moscow RUSSIA")
cities <- data.frame(x,y)

cities
x              y
1  FRANCE   Paris FRANCE
2 GERMANY Berlin GERMANY
3  RUSSIA  Moscow RUSSIA

Oczekiwane rezultaty:

     x              y      new
1  FRANCE   Paris FRANCE     Paris
2 GERMANY Berlin GERMANY     Berlin
3  RUSSIA  Moscow RUSSIA     Moscow

Czego dotychczas próbowałem (bez skutku):

to dostaje ten sam df, ale usunięcie miasta (wbrew żądaniom)

 cities %>% mutate(new = setdiff(x,y))

x              y     new
1  FRANCE   Paris FRANCE  FRANCE
2 GERMANY Berlin GERMANY GERMANY
3  RUSSIA  Moscow RUSSIA  RUSSIA

Przeciwnie, setdiff w odwrotnej kolejności otrzymuje te same dane początkowe

 cities %>% mutate(new = setdiff(y,x))

x                y       new
1  FRANCE   Paris   FRANCE   Paris FRANCE
2  GERMANY Berlin   GERMANY  Berlin GERMANY
3  RUSSIA  Moscow   RUSSIA   Moscow RUSSIA

Usunięcie gsub działało tylko w pierwszym wierszu, wyświetlając ostrzeżenie

  cities %>% mutate(new = gsub(x,"",y))

Warning message:
In gsub(x, "", y) :
argument "pattern" has length > 1 and only the first element will be used
x              y            new
1  FRANCE   Paris FRANCE         Paris
2 GERMANY Berlin GERMANY Berlin GERMANY
3  RUSSIA  Moscow RUSSIA  Moscow RUSSIA

Odpowiedzi:

2 dla odpowiedzi № 1

Możemy użyć stringr::str_replace:

library(tidyverse)
cities %>%
mutate_if(is.factor, as.character) %>%
mutate(new = trimws(str_replace(y, x, "")))
#        x              y    new
#1  FRANCE   Paris FRANCE  Paris
#2 GERMANY Berlin GERMANY Berlin
#3  RUSSIA  Moscow RUSSIA Moscow

1 dla odpowiedzi nr 2

Oto rozwiązanie z bazą R:

x <- c("FRANCE","GERMANY","RUSSIA")
y <- c("Paris FRANCE", "Berlin GERMANY", "Moscow RUSSIA")
cities <- data.frame(x,y,stringsAsFactors = F)

cities$new = mapply(function(a,b)
{setdiff(strsplit(a," ")[[1]],strsplit(b," ")[[1]])}, cities$y, cities$x)

Wydajność:

        x              y    new
1  FRANCE   Paris FRANCE  Paris
2 GERMANY Berlin GERMANY Berlin
3  RUSSIA  Moscow RUSSIA Moscow

Mam nadzieję że to pomoże!