首页 文章

使用“%in%”对多列进行dplyr过滤

提问于
浏览
0

我有一个包含多列(ID,数字,位置,字段,权重)的数据框(df1) . 我还有另一个包含更多信息的数据帧(df2)(ID,PassRate,Number,Weight) .

我试图使用dplyr和%in%来过滤掉df1中与df2具有相同两个值的行 .

到目前为止我有:

df_sub <- subset(df1, df1$ID %in% df2$ID & df1$Weight %in% df2$Weight)

但这只是第一个条件的子集...任何想法为什么?

2 回答

  • 0

    从问题和示例代码中,不清楚是否希望 df_sub 包含 df1 中的_1865804_中匹配的行,或者不匹配的行 . dplyr::semi_join() 将返回带匹配的行, dplyr::anti_join() 将返回没有匹配的行 .

    df_sub <- semi_join(x=df1, y=df2, by=c("ID","Weight"))
    

    要么

    df_sub <- anti_join(x=df1, y=df2, by=c("ID","Weight"))
    
  • 1

    试试这个 ,

    df1[paste0(df1$ID,df1$Weight)%in%paste0(df2$ID,df2$Weight),]
    

    你正在做的是过滤 df1df2 值,而不是找到行匹配

    试试这个样本数据

    df1 
    ID  Weight
    1   a
    2   b
    
    
    df2 
    ID  Weight
    1   b
    2   a
    

    使用你的功能

    df_sub <- subset(df1, df1$ID %in% df2$ID & df1$Weight %in% df2$Weight)
    
    
    > df_sub
      ID Weight
    1  2      b
    2  1      a
    

    实际上,它会返回下面的布尔值,这会导致所有 df1 值显示在 df2 上:

    True  True
     True  True
    

    使用我的,结果是没有人匹配:

    df1[paste0(df1$ID,df1$Weight)%in%paste0(df2$ID,df2$Weight),]
    
    [1] ID     Weight
    <0 rows> (or 0-length row.names)
    

相关问题