在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)输入和执行速度最快.
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 = TRUE的sum功能,你会得到你想要的结果.
> 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)