在R

时间:2017-10-09 17:34:40

标签: r

假设我有这个数据集:

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

如果我想在'data1'和'data2'中将30个值的'数据'子集,那么最好的方法是什么?例如,从'data'我想选择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)

但这似乎不符合两个条件,而是一个或另一个。

1 个答案:

答案 0 :(得分:1)

请注意,在您的原始subset中,您没有将|data1的{​​{1}}测试包含在括号中。这会产生错误的子集&#34; data1 = 4或12或13或24 OR data2 = 4或12或13或24&#34;。你真的想要:

data2

以下是使用subdata <- subset(data, (data1 == 4 |data1 == 12 |data1 == 13 |data1 == 24) & (data2 == 4 |data2 == 12 |data2 == 13 |data2 == 24)) 修改subset功能的方法:

%in%

下面我使用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