dplyr:使用**选择 NA 值**过滤多个条件
dplyr: Filter multiple conditions with **selection NA values**
我知道 关于 filter multiple conditions
的所有问题,并提供了非常全面的答案,例如 Q1, Q2, or even for removing NA values
Q3, 。
但我有一个不同的问题,如何使用 dplyr
或什至 data.table
函数来实现 filter
以同时保留 NA
值和 conditional parameters
?
作为下面的示例,我想保留 Var3
中的所有值,即 >5
PLUS 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
我试过以下但没有成功:
##Using dplyr::filter
DT %>% filter(!Var3 ==5)
Var1 Var2 Var3 Var4
1 3 d 2 1
2 5 <NA> 2 4
# or
DT %>% filter(Var3 <5 & is.na(Var3))
[1] Var1 Var2 Var3 Var4
<0 rows> (or 0-length row.names)
## using data.table
DT[DT[,.I[Var3 <5], Var1]$V1]
Var1 Var2 Var3 Var4
1: NA NA NA NA
2: NA NA NA NA
3: 3 d 2 1
4: 5 NA 2 4
非常感谢任何解释方面的帮助!
对于 data.table
,我们使用以下逻辑来过滤 'Var3' 小于 5 而不是 NA (!is.na(Var3)
) 或 (|
) 的行如果是 NA
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
我认为这会奏效。使用 |
表示过滤器为 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))
我知道 关于 filter multiple conditions
的所有问题,并提供了非常全面的答案,例如 Q1, Q2, or even for removing NA values
Q3,
但我有一个不同的问题,如何使用 dplyr
或什至 data.table
函数来实现 filter
以同时保留 NA
值和 conditional parameters
?
作为下面的示例,我想保留 Var3
中的所有值,即 >5
PLUS 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
我试过以下但没有成功:
##Using dplyr::filter
DT %>% filter(!Var3 ==5)
Var1 Var2 Var3 Var4
1 3 d 2 1
2 5 <NA> 2 4
# or
DT %>% filter(Var3 <5 & is.na(Var3))
[1] Var1 Var2 Var3 Var4
<0 rows> (or 0-length row.names)
## using data.table
DT[DT[,.I[Var3 <5], Var1]$V1]
Var1 Var2 Var3 Var4
1: NA NA NA NA
2: NA NA NA NA
3: 3 d 2 1
4: 5 NA 2 4
非常感谢任何解释方面的帮助!
对于 data.table
,我们使用以下逻辑来过滤 'Var3' 小于 5 而不是 NA (!is.na(Var3)
) 或 (|
) 的行如果是 NA
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
我认为这会奏效。使用 |
表示过滤器为 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))