【问题标题】:dplyr filtering on multiple columns using "%in%"dplyr 使用“%in%”过滤多列
【发布时间】:2017-08-10 21:04:55
【问题描述】:

我有一个包含多列(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) 

但这只是第一个条件的子集……知道为什么吗?

【问题讨论】:

  • df1[paste0(df1$ID,df1$Weight)%in%paste0(df2$ID,df2$Weight),]
  • 使用anti_join
  • mergeinner_joinIDWeight 上...忽略&amp;&amp; 评论是不好的。

标签: r statistics dplyr


【解决方案1】:

试试这个,

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

您正在做的是通过df2 值过滤df1,而不是找到匹配行

试试这个示例数据

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)

【讨论】:

    【解决方案2】:

    从问题和示例代码中,不清楚您是否希望 df_sub 包含 df1 中在 df2 中匹配的行,或者不包含匹配的行。 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")) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2017-06-09
      相关资源
      最近更新 更多