2016-01-05 133 views
4

我有一個數據框叫做mydf,其中列ab的元素用逗號分隔。我想要做的是匹配ab列中的值,刪除(或忽略)括號()中的值,並獲取result中的common列。如何匹配由逗號分隔的兩列元素

mydf 
    a       b     
1 at1 (1) , 23-x (0)    at1,23-x,gt 
2 hh (2) , pp (0)    pp 
3 cg (4) , gh (9) , th (7) th,cg 


result 
    a       b     common 
1 at1 (1) , 23-x (0)    at1,23-x,gt   at1,23-x 
2 hh (2) , pp (0)    pp    pp  
3 cg (4) , gh (9) , th (7) rh,cg    cg    

數據:

mydf <- read.table(
    text = "a|b     
    at1 (1) , 23-x (0)|at1,23-x,gt 
    hh (2) , pp (0)|pp 
    cg (4) , gh (9) , th (7)|th,cg", 
    sep = "|", header = TRUE, 
    colClasses = rep("character", 2) 
) 
+3

試着留意以下事實:當您使*方便*重現問題時,人們將更可能嘗試回答您的問題。 'dput'本來就是分享對象的更好選擇。 – nrussell

回答

4

我們可以通過數據集(lapply(mydf, ..)的列循環,使用str_extract得到字母字符。然後,獲取相應的list元素的intersectMap,將公共元素與toString,unlist聯接,並將vector作爲數據集中的新列「common」。

library(stringr) 
lst <- lapply(mydf, function(x)str_extract_all(x, '\\b[a-z]+\\b')) 
mydf$common <- unlist(Map(function(x,y) toString(intersect(x,y)), 
          lst[[1]], lst[[2]])) 
+0

謝謝!我在使用您的解決方案時遇到了問題,因爲我剛纔更新了數據,包括字母數字和符號。我只是想省略括號內的元素,所以我試圖改變你的解決方案在'lst'上面。但是,我仍然有問題得到正確的答案。請問你能幫幫我嗎? – MAPK

+1

@MAPK試試'lst < - lapply(mydf,function(x)str_extract_all(x,'(?<!\\()[[:alnum:] - ] +'))' – akrun

+0

非常感謝! – MAPK