【问题标题】:filter multiple columns together with criteria - R使用条件过滤多个列 - R
【发布时间】:2019-03-27 17:57:25
【问题描述】:

我发现了很多类似的问题(123 是其中的一些),但没有一个回答我的问题:

我有这些数据:

set.seed(100)
df <- data.frame(X = sample(1:10, 100, replace=TRUE),
                 Y = sample(11:90, 100, replace=TRUE),
                 Z = sample(1000:2000, 100, replace=TRUE),
                 stringsAsFactors = FALSE)
x <- data.frame(X = c(7, 5, 3, 9),
                     Y = c(14, 13, 19, 87),
                     stringsAsFactors = FALSE)

其中xdf 的子集,具有特定的分组和计算。现在,我正在尝试通过x 两个列过滤df。例如,对于df 中的特定行,它必须是X=7Y=14 才能成为TRUE,或者X=5Y=13 才能成为TRUE,它必须是FALSE如果X=7Y&lt;&gt;14,等等。因此,标准必须同时考虑两列。我试过这个:

> df[df$X == x$X & df$Y == x$Y,]
   X  Y    Z
28 9 87 1071

当我知道它必须至少为 4 时,这给了我一个真正的价值(因为 xdf 的子集)

这就是我正在寻找的东西(它给了我 0 行):

df[df[,c("X","Y")] %in% x[,c("X","Y")],]

预期输出:

   X  Y    Z
16 7 14 1632
28 9 87 1071
30 3 19 1297
38 7 14 1701
67 5 13 1323
77 9 87 1484
88 3 19 1951

【问题讨论】:

  • 能否显示预期的输出
  • @camille 行索引 16 和 38。
  • @akrun 我已经添加了预期的输出
  • 好的,那么输出似乎与我下面的解决方案匹配

标签: r dplyr data-manipulation


【解决方案1】:

我们可能需要inner_join

library(dplyr)
inner_join(df, x)
#  X  Y    Z
#1 7 14 1632
#2 9 87 1071
#3 3 19 1297
#4 7 14 1701
#5 5 13 1323
#6 9 87 1484
#7 3 19 1951

如果我们也需要匹配行名

df[do.call(paste, df[names(x)]) %in% do.call(paste, x),]
#   X  Y    Z
#16 7 14 1632
#28 9 87 1071
#30 3 19 1297
#38 7 14 1701
#67 5 13 1323
#77 9 87 1484
#88 3 19 1951

【讨论】:

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