最简单的过滤语法(在R中)

时间:2014-04-23 15:26:20

标签: r dataframe dplyr

我正在尝试找到使用最少语法过滤数据集的最简单方法。这个例子将包含最少的数据,但我正试图找到一种方法来为更大的数据集推广它。

这是我的示例数据集:

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

提前感谢您的帮助和建议!

1 个答案:

答案 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处的警告。