【问题标题】:Subsetting data by multiple values in multiple variables in RR中多个变量中的多个值对数据进行子集化
【发布时间】:2017-10-09 17:34:40
【问题描述】:

假设我有这个数据集:

data1 = sample(1:250, 250)
data2 = sample(1:250, 250)
data <- data.frame(data1,data2)

如果我想在 'data1' 和 'data2' 中将 'data' 子集化为 30 个值,那么最好的方法是什么?例如,从“数据”中,我想选择 data1= 4 或 12 或 13 或 24 且 data2= 4 或 12 或 13 或 24 且 data2= 4 或 12 或 13 或 24 的所有行。我想要同时满足这两个条件的行是真的。

我是这样写的:

subdata <- subset(data, data1 == 4 |data1 == 12 |data1 == 13 |data1 == 24 & data2 == 4 |data2 == 12 |data2 == 13 |data2 == 24)

但这似乎并不同时满足两个条件,而是一个或另一个。

【问题讨论】:

  • 您正在寻找%in%:接近的应该是dat[dat$data1 %in% c(4, 12, 13) &amp; dat$data2 %in% c(4, 12, 13), ]。只需根据您的确切需求进行调整。不鼓励使用与现有 R 对象相同的名称,因为这会导致混淆。 data 是现有函数。
  • 这就是我要找的!感谢您的帮助。

标签: r


【解决方案1】:

请注意,在您原来的subset 中,您没有将|data1data2 测试包装在括号中。这会产生“data1= 4 or 12 or 13 or 24 OR data2= 4 or 12 or 13 or 24”的错误子集。你实际上想要:

subdata <- subset(data, (data1 == 4 |data1 == 12 |data1 == 13 |data1 == 24) & (data2 == 4 |data2 == 12 |data2 == 13 |data2 == 24))

以下是您将如何使用%in% 修改您的subset 函数:

subdata <- subset(data, (data1 %in% c(4, 12, 13, 24)) & (data2 %in% c(4, 12, 13, 24)))

下面我提供了一个优雅的dplyr 方法和filter_all

library(dplyr)
data %>%
  filter_all(all_vars(. %in% c(4, 12, 13, 24)))

注意:

您的sample 函数不会轻易生成测试实际为真的样本数据。因此,上述解决方案可能会返回零行。因此,我修改了您的示例数据集以生成实际上具有您可以子集的匹配项的行。

数据:

set.seed(1)
data1 = sample(c(4, 12, 13, 24, 100, 123), 500, replace = TRUE)
data2 = sample(c(4, 12, 13, 24, 100, 123), 500, replace = TRUE)
data <- data.frame(data1,data2)

【讨论】:

  • @ArielKaputkin 如果您认为此答案有帮助,请考虑通过单击反对按钮下方的灰色复选标记来接受它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多