我正在尝试找到使用最少语法过滤数据集的最简单方法。这个例子将包含最少的数据,但我正试图找到一种方法来为更大的数据集推广它。
这是我的示例数据集:
samp <- structure(list(group = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L,
4L), .Label = c("a", "b", "c", "d"), class = "factor"), name = structure(c(5L,
3L, 7L, 2L, 6L, 8L, 4L, 1L), .Label = c("hollis", "jo", "joe",
"mike", "pat", "scott", "steph", "tim"), class = "factor")), .Names = c("group",
"name"), class = "data.frame", row.names = c(NA, -8L))
假设我想过滤到group == 'a' | group == 'b'
。
我尝试了match
,但它只返回了第一场比赛。
filt <- c('a', 'b')
samp[match(filt, s$group), ]
group name
1 a pat
2 b joe
我已经尝试了filter
,但语法可能会因很多过滤参数而变得冗长。
library(dplyr)
filter(samp, group == 'a' | group == 'b')
group name
1 a pat
2 b joe
3 a scott
4 b tim
理想情况下,我想找到一个类似的解决方案:
library(dplyr)
filt <- c('a', 'b')
filter(samp, group == any(filt))
group name
1 a pat
2 b joe
3 a scott
4 b tim
不幸的是,这会返回以下错误。
[1] group name
<0 rows> (or 0-length row.names)
Warning message:
In any(c("a", "b")) : coercing argument of type 'character' to logical
提前感谢您的帮助和建议!
答案 0 :(得分:3)
尝试%in%
:
samp[samp$group %in% c("a", "b"), ]
# group name
# 1 a pat
# 2 b joe
# 5 a scott
# 6 b tim
您正在寻找的dplry
方法可能就是:
library(dplyr)
filter(samp, group %in% c("a", "b"))
# group name
# 1 a pat
# 2 b joe
# 3 a scott
# 4 b tim
这类似于基础R的subset(samp, subset=group %in% c("a", "b"))
,但在考虑以非交互方式使用它之前请注意?subset
处的警告。