2016-01-05 57 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