2011-08-25 67 views
2
a=c("A","A,B","C","B,C") 
b=c(1,2,3,4) 
dat<-data.frame(a,b) 

c=c("A","B","D","A") 
d=c(5,6,7,8) 
g<-data.frame(c,d) 

我想比较dat和g。如果dat列a中的元素与g中列c的元素相匹配,则g中列d的匹配项应添加到dat中。将strsplit逐行应用并将列添加到数据

dat$NEW ="" 
sapply(strsplit(as.character(dat$a), ","),function(x){tmp=grep(x,g$c);dat$NEW=x) 

我怎样才能让:在DAT $ NEW

g[grep("A",g$c),] 
    c d 
1 A 5 
4 A 8 

条目应该看起来像 “5,8”?

回答

1

这是适用于您的数据?

find.match <- g$c %in% dat$a 
g[find.match, ] 
    c d 
1 A 5 
4 A 8 
+0

感谢您的回复,但是我在dat中丢失了命中“B”的数字“A,B” – Jasmine

0

这并不完全清楚,但是这有什么,我认为你的描述:

步骤1:将您的data.frame摹复制的元素

> gc <- sapply(split(g$d, g$c), paste, collapse=",") 
> gc 
    A  B  D 
"5,8" "6" "7" 

步骤2:将本到您的data.frame DAT

cbind(dat, 
    new=sapply(
     dat$a, 
     function(x)paste(
       gc[match(strsplit(as.character(x), ",")[[1]], g$c)], 
       collapse=",") 
    ) 
) 

结果:

a b new 
1 A 1 5,8 
2 A,B 2 5,8,6 
3 C 3 NA 
4 B,C 4 6,NA 
+0

太棒了!我想扩展我的g: c = c(“A,B”,“B”,“D”,“A”) d = c(5,6,7,8) g <-data .frame(c,d) dat中的“A”应该与g(“A,B”,“A”)中出现的“A”匹配,那么我必须使用grep? – Jasmine

+0

可能有涉及'grep'的解决方案,但我修改了我的答案,通过使用'strsplit'和'match'来给出我想要的结果 – Andrie