如何使用条件过滤数据帧?

时间:2018-12-21 09:36:28

标签: r

我想根据一列的值过滤数据帧。

如果某列包含值123,则挑选出这些行,然后过滤C = 1;如果某列不包含123,则选择那些行,然后过滤D = 0

这是测试df:

Book1 <- data.frame(
  'A' = c(123, 5, 6, 12, 445, 123),
  'B' = c(4, 56, 77, 1, 2, 3),
  'C' = c(1, 1, 0, 0, 1, 0),
  'D' = c(1, 0, 0, 1, 1, 0)
)

尽管我可以产生2个结果:

library(tidyverse)
Book1 %>% 
  filter(A == 123) %>% 
  filter(C == 1)

Book1 %>% 
  filter(A != 123) %>% 
  filter(D == 0)

然后使用rbind()产生结果:

    A  B C D
1 123  4 1 1
2   5 56 1 0
3   6 77 0 0

但是,有人可以教我如何使用filterif_else获得相同的结果吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用&(和)和|(或)来区分您的条件,即

filter(Book1, (A == 123 & C == 1) | (A != 123 & D == 0))
#    A  B C D
#1 123  4 1 1
#2   5 56 1 0
#3   6 77 0 0

答案 1 :(得分:3)

你可以做

library(dplyr)

Book1 %>%
  filter(if_else(A == 123, C == 1, D == 0))

#    A  B C D
#1 123  4 1 1
#2   5 56 1 0
#3   6 77 0 0

这也可以在基数R中完成

Book1[with(Book1, ifelse(A == 123, C == 1, D == 0)), ]

答案 2 :(得分:1)

语法略有不同(@Ronak Shah建议不使用with

 Book1[ifelse(Book1$A == 123, Book1$C == 1, Book1$D == 0), ]