x1<-data.frame(m1=c(1,2,3),m2=c('f,a,b,c','edfc,avv,c','g,e,f,k'),m3=c('--,c,b,d','--kr,edfc,avcv,ce','f,g,l,e,l,p'),stringsAsFactors=F)
> x1
m1 m2 m3
1 1 f,a,b,c --,c,b,d
2 2 edfc,avv,c --kr,edfc,avcv,ce
3 3 g,e,f,k f,g,l,e,l,p
现在需要求m2和m3两列元素的交集个数,用如下代码
x1$gg=mapply(function(x,y) length(intersect(strsplit(x,split=',')[[1]],strsplit(y,split=',')[[1]])), x1$m2, x1$m3)
x1
m1 m2 m3 gg
1 1 f,a,b,c --,c,b,d 2
2 2 edfc,avv,c --kr,edfc,avcv,ce 1
3 3 g,e,f,k f,g,l,e,l,p 3
还有一种做法使用tidyr包里面的separate_rows函数
library(tidyr)
a<-separate_rows(separate_rows(x1, m2, convert = TRUE),m3)
> a[a$m2==a$m3,]
m1 m2 m3
11 1 b b
14 1 c c
19 2 edfc edfc
33 3 g g
41 3 e e
44 3 f f
> table(a[a$m2==a$m3,]$m1)
1 2 3
2 1 3