我知道<{1}}有关filter multiple conditions
的所有问题以及Q1,Q2等非常全面的答案,甚至删除{{1} }} Q3,Q4。
但我有一个不同的问题,我如何NA values
使用filter
甚至dplyr
函数保留data.table
值和NA
?
作为以下示例,我希望将conditional parameters
中的所有值保留为Var3
PLUS >5
NA
values
预期结果:
library(data.table)
library(dplyr)
Var1<- seq(1:5)
Var2<- c("s", "a", "d", NA, NA)
Var3<- c(NA, NA, 2, 5, 2)
Var4<- c(NA, 5, 1, 3,4)
DT <- data.table(Var1,Var2,Var3, Var4)
DT
Var1 Var2 Var3 Var4
1: 1 s NA NA
2: 2 a NA 5
3: 3 d 2 1
4: 4 NA 5 3
5: 5 NA 2 4
我尝试了以下但未成功:
Var1 Var2 Var3 Var4
1: 1 s NA NA
2: 2 a NA 5
3: 3 d 2 1
4: 5 NA 2 4
任何有关解释的帮助都非常感谢!
答案 0 :(得分:3)
我认为这会奏效。使用|
表示过滤器的or
。 dt2
是预期的输出。
library(dplyr)
Var1 <- seq(1:5)
Var2 <- c("s", "a", "d", NA, NA)
Var3 <- c(NA, NA, 2, 5, 2)
Var4 <- c(NA, 5, 1, 3, 4)
dt <- data_frame(Var1, Var2, Var3, Var4)
dt2 <- dt %>% filter(Var3 < 5 | is.na(Var3))
答案 1 :(得分:2)
使用data.table
,我们使用以下逻辑来过滤&#39; Var3&#39;如果是NA,则小于5且不是NA(!is.na(Var3)
)或(|
)
DT[(Var3 < 5& !is.na(Var3)) | is.na(Var3)]
# Var1 Var2 Var3 Var4
#1: 1 s NA NA
#2: 2 a NA 5
#3: 3 d 2 1
#4: 5 NA 2 4
如果我们需要dplyr
,只需在filter
DT %>%
filter((Var3 <5 & !is.na(Var3)) | is.na(Var3))
正如@ycw所提到的那样& !is.na(Var3)
并不是真的需要,但如果我们删除is.na(Var3)
,它就变得很重要了
DT[, Var3 < 5 ]
#[1] NA NA TRUE FALSE TRUE
DT[, Var3 < 5 & !is.na(Var3)]
#[1] FALSE FALSE TRUE FALSE TRUE