在数据框或矩阵中计算非零元素的数量

4

我有一个大的数据框,大小为190,000行X 13列的整数。我想得到整个数据框中所有非零整数的计数。

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


6
sum(df!=0) 是什么意思? - shadow
1个回答

7
共识是sum(df != 0)比目前被接受的解决方案更短更高效。我会补充说,如果您有像您所说的整数,则应该使用0L(整数)进行比较,而不是0(数字)以避免不必要的转换。此外,将数据框转换为矩阵将更快。以下是一些基准测试:
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倍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接