在R中,计算逻辑向量中TRUE
值的数量的最有效/惯用的方法是什么?我可以想到两种方法:
z <- sample(c(TRUE, FALSE), 1000, rep = TRUE)
sum(z)
# [1] 498
table(z)["TRUE"]
# TRUE
# 498
你更喜欢哪一个?还有比这更好的吗?
发布于 2010-02-03 20:29:47
最安全的方法是在na.rm = TRUE
中使用sum
sum(z, na.rm = TRUE) # best way to count TRUE values
结果是1。
当逻辑向量包含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)
此外,table
解决方案效率较低(请查看table
函数的代码)。
此外,您应该小心使用“表”解决方案,以防逻辑向量中没有真值。例如,请参阅:
z <- c(FALSE, FALSE)
table(z)["TRUE"] # gives you `NA`
或
z <- c(NA, FALSE)
table(z)["TRUE"] # gives you `NA`
发布于 2010-02-03 20:44:19
另一种没有提到的选择是使用which
length(which(z))
只是提供一些关于“哪个是更快的问题”的上下文,测试自己总是最简单的。为了进行比较,我将向量做得更大:
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
显然,在这种情况下,使用sum
是最好的方法。您可能还希望按照马雷克的建议检查NA
的值。
只需添加一条关于NA值和which
函数的注释:
> which(c(T, F, NA, NULL, T, F))
[1] 1 4
> which(!c(T, F, NA, NULL, T, F))
[1] 2 5
请注意,它只检查逻辑TRUE
,因此它基本上忽略了非逻辑值。
发布于 2010-02-03 20:17:39
另一种方式是
> length(z[z==TRUE])
[1] 498
虽然sum(z)
短小精悍,但对我来说,length(z[z==TRUE])
更多的是自我解释。不过,我认为像这样一个简单的任务并没有真正的不同……
如果它是一个大的向量,你可能应该使用最快的解决方案,那就是sum(z)
。length(z[z==TRUE])
大约比sum(z)
慢10倍,table(z)[TRUE]
大约比sum(z)
慢200倍。
总而言之,sum(z)
是输入和执行速度最快的。
https://stackoverflow.com/questions/2190756
复制相似问题