2011-05-30 42 views
3

R.中的专家R在多列中的确切和部分匹配

我有两个数据框。

数据框之一:

df1 <- c("xx", "bb", "zz") 

数据帧二:

df2 <- data.frame(A=c("xx", "be", "zz", "jj"), B=c("xyx, uu, zz", "uu, zbbz, zbz, ccc", "cc, zzx", "ddd"), C=c("bbbb", "yyy", "xxq", "ooo"), D=c("ooo", "yyy", "ccc", "zoz")) 

因此,DF2如下:

A     B C D 
1 xx  xyx, uu, zz bbbb ooo 
2 be uu, zbbz, zbz, ccc yyy yyy 
3 zz   cc, zzx xxq ccc 
4 jj    ddd ooo zoz 

我想匹配与Y X得到一个新的数据帧。看着Stackoverflow的答案,我学会了如何做一些精确匹配。在目前的情况下,我想要做精确匹配和部分匹配。在我看来,“grep”可能会有所帮助,但我无法为我的案例工作,请给予帮助。

在df1中,我需要三个词来匹配“xx”,“bb”和“zz”。而不是在df2中搜索确切的xx,bb,zz。我想检查这些条款是否可以在df2的A列和B列中找到,这些列可能包含完全匹配和部分匹配。

例如,我会考虑

  1. XX匹配行1(确切匹配A1)

  2. BB同时匹配行2只(部分 匹配B2)

  3. zz匹配第1行 和第3行(部分匹配B1和 与A3完全匹配,部分匹配 也与B3),

  4. 作为ZZ匹配具有两个 两个项目,我想将一个 与完全匹配进行排序先是在最后 数据帧,即第一ROW3, 第1行示出了下一个向上所示。

  5. 虽然排4 的DF2不匹配与 表anythings,因此,它不会出现在最终的数据帧 。

最后,我想通过添加相应DF2一个数据帧到DF1如下:

V1 A     B C D 
1 xx xx  xyx, uu, zz bbbb ooo 
2 bb be uu, zbbz, zbz, ccc yyy yyy 
3 zz zz   cc, zzx xxq ccc 
4 zz xx  xyx, uu, zz bbbb ooo 

是grep的或排序在这种情况下使用?请指示更聪明的方式来做到这一点。谢谢。

+0

对于你的问题的第一部分将在数据帧的结果是什么?坐标或匹配的字符串? – 2011-05-30 03:02:55

回答

2

这应该让你有:

dfrPerVal<-lapply(df1, function(dfrPartFor){ 
     whereFoundA<-grep(dfrPartFor, df2$A, fixed=TRUE) 
     whereFoundB<-grep(dfrPartFor, df2$B, fixed=TRUE) 
     retval<-cbind(1=dfrPartFor, df[union(whereFoundA, whereFoundB),] 
     xmatch<-which((retval$A==dfrPartFor) | (retval$B==dfrPartFor)) 
     if(length(xmatch) > 0) 
     { 
      retval<-rbind(retval[xmatch, ], retval[-xmatch, ]) 
     } 
     return(retval) 
    }) 
finalResult<-do.call(rbind, dfrPerVal) 

没有疑问,更好的解决方案...