首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何计算逻辑向量中的真值

如何计算逻辑向量中的真值
EN

Stack Overflow用户
提问于 2010-02-03 17:03:38
回答 8查看 318.4K关注 0票数 180

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

代码语言:javascript
复制
z <- sample(c(TRUE, FALSE), 1000, rep = TRUE)
sum(z)
# [1] 498

table(z)["TRUE"]
# TRUE 
#  498 

你更喜欢哪一个?还有比这更好的吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-02-03 20:29:47

最安全的方法是在na.rm = TRUE中使用sum

代码语言:javascript
复制
sum(z, na.rm = TRUE) # best way to count TRUE values

结果是1。

当逻辑向量包含NA值时,其他解决方案存在一些问题。

例如,请参阅:

代码语言:javascript
复制
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函数的代码)。

此外,您应该小心使用“表”解决方案,以防逻辑向量中没有真值。例如,请参阅:

代码语言:javascript
复制
z <- c(FALSE, FALSE)
table(z)["TRUE"] # gives you `NA`

代码语言:javascript
复制
z <- c(NA, FALSE)
table(z)["TRUE"] # gives you `NA`
票数 195
EN

Stack Overflow用户

发布于 2010-02-03 20:44:19

另一种没有提到的选择是使用which

代码语言:javascript
复制
length(which(z))

只是提供一些关于“哪个是更快的问题”的上下文,测试自己总是最简单的。为了进行比较,我将向量做得更大:

代码语言:javascript
复制
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函数的注释:

代码语言:javascript
复制
> which(c(T, F, NA, NULL, T, F))
[1] 1 4
> which(!c(T, F, NA, NULL, T, F))
[1] 2 5

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

票数 90
EN

Stack Overflow用户

发布于 2010-02-03 20:17:39

另一种方式是

代码语言:javascript
复制
> 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)是输入和执行速度最快的。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2190756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档