在data.table中过滤字符向量时,它还会删除NA值。.这是什么逻辑?

时间:2019-07-12 14:43:22

标签: r dplyr data.table

我最近不得不计算一个字符向量,我遇到了以下问题,这对我来说似乎是个错误,但是再一次,它是如此简单,这可能是一种理想的行为-尽管我不知道为什么你会想要这种行为

在这里,我创建一个DT,过滤除NA之外的所有内容并对其进行计数。一切都很好。

library(data.table)

test1 <- data.table(v1=c(rep('A',5),rep('B',5),rep(NA,5)))
test1[is.na(v1), .(n_NA= .N), .(v1)]

在test2中,我过滤了'A'的所有值。但是,data.table也删除了NA。

test2 <- test1[v1!='A']
test2[is.na(v1), .(n_NA= .N), .(v1)]

只有在我明确告诉data.table保留其这样做的NA的情况下。

test3 <- test1[!v1=='A' | is.na(v1)]
test3[is.na(v1), .(n_NA= .N), .(v1)]

现在,基数R在which()函数中执行相同的操作,但在返回TRUE FALSE的逻辑向量中不执行该操作

test4 <- as.data.frame(test1)
    test4[test4$v1!='B',]       
test4[which(test4$v1!='B'),]

并且dplyr会执行相同的操作-即删除NA。

dplyr::filter(test1, v1!='A')

所以,我想一定是有一定道理的。但是我就是不明白。我明确表示我想要任何东西,但“ A”,默认行为是也要删除NA?有人可以解释吗?

1 个答案:

答案 0 :(得分:0)

R测试NA != "A"时,它返回NA而不是TRUEFALSE。当您尝试在向量中包含NA值的data.table子集时,它只会将其删除。

您可以尝试使用%in%。例子:

NA %in% "A" #FALSE
NA %in% NA #TRUE
"B" %in% "A" #FALSE
"B" %in% "BA" #FALSE
"B" %in% "B" #TRUE

对于您的特定示例:

library(data.table)
test1 <- data.table(v1=c(rep('A',5),rep('B',5),rep(NA,5)))
test1[!(v1 %in% "A")]
# Output: data.table of one column v1 with 5 Bs and 5 NAs