2017-02-17 2 views
0

у меня есть фрейм данных с двумя колонками с разделителями строк:Нахождение строк разделяют между двумя dataframe колоннами

df <- data.frame('a'=c('a, b, c, d', 'a, c', 'b, d'), 'b'=c('a, d', 'a', 'a, d')) 

      a  b 
1 a, b, c, d a, d 
2  a, c  a 
3  b, d a, d 

И я хотел бы создать третий столбец, чтобы включить строки, пересекающие первые две колонки, для пример:

  a  b  c 
1 a, b, c, d a, d a, d 
2  a, c  a  a 
3  b, d a, d  d 

Я попробовал несколько подходов, которые включают преобразование строки в списки и обратно, но я, кажется, не быть в состоянии получить это право.

Использование dplyr я впервые попытался использовать:

df <- df %>% 
    mutate(c=paste(c(intersect(unlist(strsplit(a, split=", ")), unlist(strsplit(b, split=", ")))))) 

что привело к ошибке:

Error in eval(substitute(expr), envir, enclos) : wrong result size (2), expected 3 or 1

А также не возвращает требуемую строку, это также, кажется, возвращают результаты одного и того же размера для каждой строки (подтверждено путем изменения функции mutate выше от paste до length ниже):

df %>% 
    mutate(c=length(c(intersect(unlist(strsplit(a, split=", ")), unlist(strsplit(b, split=", ")))))) 

      a b c 
1 a, b, c, d a, d 2 
2  a, c a 2 
3  b, d a, d 2 

Это заставляет меня беспокоиться, что все результаты моих строк объединяются в один результат и повторяются.

Чтобы попытаться упростить вещи я попытался преобразовать мои строки в списках перед использованием функции пересекаться:

df %>% mutate(a_list=list(unlist(strsplit(a, split=", ")))) 

Но получил ошибку:

Error in eval(substitute(expr), envir, enclos) : not compatible with STRSXP

что делает удивительно, если списки в кадрах данных совместимы с tidyverse и, как таковой, если мне нужно использовать совершенно другой подход.

Любые советы о том, как подойти к проблеме поиска строк, разделяемых между двумя столбцами фрейма данных в R (а также любое представление о том, как обрабатывать список, как значения в кадрах данных), будут с благодарностью получены.

ответ

1

Этот базовый метод R будет работать: используйте strsplit, чтобы разделить переменные на списки с каждым элементом вектора символов. Функция mapply принимает списки и применяет следующую операцию к парам элементов в каждом списке, которые находятся в одном и том же месте. Затем используйте insersect, чтобы найти перекрывающиеся элементы и paste с крахом, чтобы вставить их вместе.

df$c <- mapply(function(x, y) paste(intersect(x, y), collapse=", "), 
       strsplit(df$a, ", "), strsplit(df$b, ", ")) 

df 
      a b c 
1 a, b, c, d a, d a, d 
2  a, c a a 
3  b, d a, d d 

данные

df <- data.frame('a'=c('a, b, c, d', 'a, c', 'b, d'), 
       'b'=c('a, d', 'a', 'a, d'), stringsAsFactors=FALSE) 
+0

Это здорово, спасибо, я, возможно, немного более заинтересован в использовании dplyr. – MrGraeme

0

Вы можете попробовать:

library(stringr) 
# go go through each row, extract the letters, search for duplicates and paste together 
apply(df, 1, function(x){ 
    tmp <- str_trim(unlist(str_split(x,","))) 
    paste(tmp[duplicated(tmp)],collapse=", ") 
}) 
[1] "a, d" "a" "d" 
Смежные вопросы