2017-02-17 49 views
0

我有分隔字符串的兩列的數據幀之間共享例如:查找字符串2分數據幀列

  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找到重疊的元素,並使用摺疊將它們粘貼在一起。

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" 
相關問題