【问题标题】:R exact and partial matching in multiple columns多列中的 R 精确和部分匹配
【发布时间】:2011-05-30 02:47:49
【问题描述】:

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

我想将 x 与 y 匹配以获取新的数据帧。查看 Stackoverflow 的答案,我学会了如何进行精确匹配。不过,在目前的情况下,我想做完全匹配和部分匹配。在我看来,“grep”可能会有所帮助,但我还不能让它适用于我的情况,请帮忙。

在 df1 中,我必须使用三个术语来匹配“xx”、“bb”和“zz”。而不是在 df2.x 中搜索精确的 xx、bb、zz。我想检查这些术语是否可以在 df2 的 A 和 B 列中找到,其中可能包含完全匹配和部分匹配。

例如,我会考虑

  1. xx 匹配第 1 行(与 A1 完全匹配)

  2. bb 仅匹配第 2 行(部分 与 B2 匹配)

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

  4. 作为 zz 匹配两个 两个项目,我想排序一个 在决赛中首先获得完全匹配 数据框,即第 3 行首先显示, 接下来显示第 1 行。

  5. 虽然第 4 行 df2 与中的任何内容都不匹配 桌子,所以,它不会出现 在最终的数据框中。

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

【问题讨论】:

  • 对于您问题的第一部分,数据框结果会是什么?坐标还是匹配的字符串?

标签: r


【解决方案1】:

这应该能让你到达那里:

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)

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

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2016-01-12
    • 2017-03-02
    • 2014-02-19
    相关资源
    最近更新 更多