2013-10-23 57 views
1

我有一个大数据框190,000行X 13列整数,我想要计算整个事情中所有非零整数的计数。计算数据帧或矩阵中非零的数量

我知道我可以编写一个嵌套for循环来遍历每列的每一行,但是有没有一个函数或一行代码可以执行相同的任务?

+6

'sum(df!= 0)'怎么样? – shadow

回答

5

共识是sum(df != 0)比目前接受的解决方案短得多和高效。我会补充说,如果你有像你说的整数,那么你应该与0L(整数)比较,而不是0(数值),以避免不必要的转换。此外,将您的data.frame转换为矩阵会更快。下面是一些基准:

df <- as.data.frame(as.matrix(sample(as.integer(0:9), 190000*13, TRUE), 190000)) 

library(microbenchmark) 
microbenchmark(
    sum(df != 0), 
    sum(df != 0L), 
    sum(as.matrix(df) != 0L) 
) 
# Unit: milliseconds 
#      expr  min  lq median  uq  max neval 
#    sum(df != 0) 57.44615 61.40066 62.83314 76.93262 116.42085 100 
#    sum(df != 0L) 46.01104 48.76516 53.00026 55.91232 74.20851 100 
# sum(as.matrix(df) != 0L) 20.25708 25.22730 27.43667 30.36676 48.23750 100 

为了比较,@ Codoremifa的溶液需要约2.5秒,即靠近上该特定数据100倍慢。

相关问题