我最近不得不计算一个字符向量,我遇到了以下问题,这对我来说似乎是个错误,但是再一次,它是如此简单,这可能是一种理想的行为-尽管我不知道为什么你会想要这种行为
在这里,我创建一个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?有人可以解释吗?
答案 0 :(得分:0)
R测试NA != "A"
时,它返回NA
而不是TRUE
或FALSE
。当您尝试在向量中包含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