根据仅适用于数据子集的条件,使用dplyr进行过滤

时间:2017-08-30 15:28:39

标签: r dplyr

是否可以使用dplyr的filter()函数仅过滤数据帧的子集?

这是一个简单的例子:

> df <- structure(list(ColA = c("x", "x", "x", "y", "y", "y"), ColB = c(1, 
                                                                      2, 3, 1, 2, 3)), .Names = c("ColA", "ColB"), class = c("tbl_df", 
                                                                                                                             "tbl", "data.frame"), row.names = c(NA, -6L))

> df
# A tibble: 6 x 2
   ColA  ColB
  <chr> <dbl>
1     x     1
2     x     2
3     x     3
4     y     1
5     y     2
6     y     3

我想过滤列&#34; ColB&#34;是&#34; 1&#34;,但仅限于&#34; ColA&#34;是&#34; y&#34;。这是想要的结果:

> df
# A tibble: 6 x 2
   ColA  ColB
  <chr> <dbl>
1     x     1
2     x     2
3     x     3
4     y     1

基地R并不难......

df[df$ColA == "x" | (df$ColA == "y" & df$ColB == 1),]

它不应该与dplyr ...但我仍然不能完全得到这个稍微不典型的情况......我必须处理数据子集(我仍然不清楚这是否可行或在哪些情况下) 我正在使用的数据比这大得多,我正在使用dplyr的管道。如果我设法使用dplyr,它将更容易阅读和更快。

谢谢!

2 个答案:

答案 0 :(得分:1)

容易羞怯

df  %>% filter((ColA == "x") | (ColA == "y" & ColB == 1))

答案 1 :(得分:1)

它与基础R几乎相同。您需要做的是将条件放在filter函数的参数中。我将==更改为%in%但是对于您的示例数据集,它们会产生相同的输出,因为NA中没有ColA

library(dplyr)

df2 <- df %>%
  filter(ColA %in% "x" | (ColA %in% "y" & ColB == 1))