分享
为什么问答平台  ›  专栏  ›  技术社区  ›  Bhavneet sharma

如何在R中查找或匹配一个数据帧作为子集(完整)到另一个数据帧? - how find or match one data frame as a subset(full) into another data frame in R?

  •  0
  • Bhavneet sharma  · 技术社区  · 5 天前

    下面给出了两个数据帧df1和df2。 df1

      c1       c2   c3  c4
       B  2.34000  1.00  I
       A 14.43000  2.10  J
       D  3.45515  1.00  K
       B  2.50000  2.09   
       A  2.44000  1.10  K
       K  5.00000  1.09  L
    

    df2 是:

      c1    c2   c3
       B  2.34  1.00
       A 14.43  2.10
       D  3.43  1.00
       B  2.50  2.09
       E  5.00  1.09
       A  2.44  1.10
    

    这里的要求是这样的:这两个数据帧之间有匹配(或比较)。如果 DF2 完全找到( 这意味着 DF2 与的任何子集匹配 DF1 不管命令如何 DF1 (或者完全匹配 DF2 DF1 与…匹配 DF2 )那么输出是 true . 如果不匹配,则返回 false .

    我尝试了以下方法:

    1. left_join(df2,df1)
    2. merge(df2,df1)
    3. inner_join(df2,df1)
    4. dd1[dd1$c1 %in% dd$c1,]
    

    以上所有方法都给出了两者之间通用的数据,但没有按要求给出结果。

    请给我一些同样的解决办法。

    0 回复  |  直到 4 天前
        1
  •  0
  •   user10488504    4 天前

    你可以用 match interaction 像:

    df1 <- read.table(text="c1       c2   c3  c4
       B  2.34000  1.00  I
       A 14.43000  2.10  J
       D  3.45515  1.00  K
       B  2.50000  2.09  NA
       A  2.44000  1.10  K
       K  5.00000  1.09  L", header=T)
    
    df2 <- read.table(text="c1    c2   c3
       B  2.34  1.00
       A 14.43  2.10
       D  3.43  1.00
       B  2.50  2.09
       E  5.00  1.09
       A  2.44  1.10", header=T)
    
    !any(is.na(match(interaction(df2), interaction(df1[names(df2)]))))
    #[1] FALSE
    
    #And packed in a function
    "%completelyFoundIn%" <- function(x, y) {!any(is.na(match(interaction(x), interaction(y[names(x)]))))}
    
    df2 %completelyFoundIn% df1
    #[1] FALSE
    
    df2[c(1,2,4,6),] %completelyFoundIn% df1
    #[1] TRUE
    
    df2[-5,c(1,3)] %completelyFoundIn% df1
    #[1] TRUE