假设我有这个数据集:
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)
但这似乎不符合两个条件,而是一个或另一个。
答案 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