如何计算逻辑向量中的TRUE值

Jyo*_*rya 152 r

在R中,计算TRUE逻辑向量中值的数量的最有效/惯用方法是什么?我可以想到两种方式:

z <- sample(c(TRUE, FALSE), 1000, rep = TRUE)
sum(z)
# [1] 498

table(z)["TRUE"]
# TRUE 
#  498 
Run Code Online (Sandbox Code Playgroud)

你喜欢哪个?还有什么更好的吗?

Mar*_*rek 162

逻辑向量包含NA值时存在一些问题.
参见例如:

z <- c(TRUE, FALSE, NA)
sum(z) # gives you NA
table(z)["TRUE"] # gives you 1
length(z[z == TRUE]) # f3lix answer, gives you 2 (because NA indexing returns values)
Run Code Online (Sandbox Code Playgroud)

所以我认为最安全的是使用na.rm = TRUE:

sum(z, na.rm = TRUE) # best way to count TRUE values
Run Code Online (Sandbox Code Playgroud)

(给出1).我认为table解决方案的效率较低(查看table函数代码).

此外,如果逻辑向量中没有TRUE值,您应该小心"表"解决方案.假设z <- c(NA, FALSE, NA)或简单地说z <- c(FALSE, FALSE)

z <- c(TRUE, FALSE, NA)
sum(z) # gives you NA
table(z)["TRUE"] # gives you 1
length(z[z == TRUE]) # f3lix answer, gives you 2 (because NA indexing returns values)
Run Code Online (Sandbox Code Playgroud)


Sha*_*ane 84

另一个未提及的选择是使用which:

length(which(z))
Run Code Online (Sandbox Code Playgroud)

只是为了实际提供"哪个更快的问题"的一些背景,它总是最容易测试自己.为了比较,我使矢量更大:

z <- sample(c(TRUE,FALSE),1000000,rep=TRUE)
system.time(sum(z))
   user  system elapsed 
   0.03    0.00    0.03
system.time(length(z[z==TRUE]))
   user  system elapsed 
   0.75    0.07    0.83 
system.time(length(which(z)))
   user  system elapsed 
   1.34    0.28    1.64 
system.time(table(z)["TRUE"])
   user  system elapsed 
  10.62    0.52   11.19 
Run Code Online (Sandbox Code Playgroud)

sum在这种情况下,明确使用是最好的方法.您可能还想检查NAMarek建议的值.

只是添加关于NA值和which功能的注释:

> which(c(T, F, NA, NULL, T, F))
[1] 1 4
> which(!c(T, F, NA, NULL, T, F))
[1] 2 5
Run Code Online (Sandbox Code Playgroud)

请注意,它只检查逻辑TRUE,因此它基本上忽略非逻辑值.


f3l*_*lix 11

另一种方式是

> length(z[z==TRUE])
[1] 498
Run Code Online (Sandbox Code Playgroud)

虽然sum(z) 很好很短,但对我length(z[z==TRUE])来说更能自我解释.虽然,我认为通过这样一个简单的任务,它并没有真正有所作为......

如果它是一个大向量,你可能应该选择最快的解决方案sum(z).length(z[z==TRUE])大约慢了10倍,慢了table(z)[TRUE]大约200 倍sum(z).

总结一下,sum(z)输入和执行速度最快.


aL3*_*3xa 6

which是一个很好的选择,特别是当你对矩阵进行操作时(检查?which并注意arr.ind参数).但我建议你坚持sum,因为na.rm可以处理NA逻辑向量的论证.例如:

# create dummy variable
set.seed(100)
x <- round(runif(100, 0, 1))
x <- x == 1
# create NA's
x[seq(1, length(x), 7)] <- NA
Run Code Online (Sandbox Code Playgroud)

如果你输入sum(x)你会得到NA一个结果,但如果传递na.rm = TRUEsum功能,你会得到你想要的结果.

> sum(x)
[1] NA
> sum(x, na.rm=TRUE)
[1] 43
Run Code Online (Sandbox Code Playgroud)

你的问题是严格的理论问题,还是你有一些关于逻辑向量的实际问题?


小智 6

另一种选择是使用汇总功能.它给出了Ts,Fs和NA的总结.

> summary(hival)
   Mode   FALSE    TRUE    NA's 
logical    4367      53    2076 
> 
Run Code Online (Sandbox Code Playgroud)