вычесть две строки в строке dplyr для R-кадра данных - PullRequest
0 голосов
/ 14 мая 2018

Имеют два столбца и нуждаются в третьем вычитании двух с использованием dplyr. Очень простой пример для наглядности. Сплит / раздельный подход недопустим в моем случае.

 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

Ожидаемые результаты:

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

Что я пробовал до сих пор (безрезультатно):

это получает тот же самый df, но удаляя город (вопреки желанию)

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

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

Напротив, setdiff в обратном порядке получает те же исходные данные

 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

Использование gsub для удаления сработало только для первой строки, выдающей предупреждение

  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

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вот решение с базой 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)

Вывод:

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

Надеюсь, это поможет!

0 голосов
/ 14 мая 2018

Мы можем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...