我想根据一列的值过滤数据帧。
如果某列包含值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
但是,有人可以教我如何使用filter
,if_else
获得相同的结果吗?
谢谢!
答案 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), ]