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函数的代码)。
另外,在使用“表”解决方案时应该小心,以防逻辑向量中没有 TRUE 值。例如:
z <- c(FALSE, FALSE)
table(z)["TRUE"] # gives you `NA`
或者
z <- c(NA, FALSE)
table(z)["TRUE"] # gives you `NA`
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值,正如 Marek 建议的那样。
# create dummy data frame - values from 1 to 5
set.seed(100)
d <- as.data.frame(matrix(round(runif(200,1,5)), 10))
# create solution vector
sol <- round(runif(20, 1, 5))