R在多列中精确匹配和部分匹配

时间:2011-05-30 02:47:50

标签: r grep match

R的专家。

我有两个数据帧。

dataframe one:

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

我想将x与y匹配以获得新的数据帧。看看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与任何事都不匹配 表,所以,它不会出现 在最终的数据框中。

  6. 最后,我想通过将相应的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或sort吗?请指出更聪明的方法。感谢。

1 个答案:

答案 0 :(得分: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)

毫无疑问,更好的解决方案......