【问题标题】:calculate fast row means计算快速行均值
【发布时间】:2018-10-22 22:43:53
【问题描述】:

我正在尝试计算大数据表中的行均值,例如

set.seed(1)
DT <- data.table(a = rnorm(4000000), b = rnorm(4000000), c = rnorm(4000000), 
                 d = rnorm(4000000), e = rnorm(4000000))

它还包含随机 NA 和许多具有完整 NA 的行(我不知道如何在上面的示例中随机插入这些)。

我正在使用以下代码来计算行总和:

DT[,sums:= rowMeans(.SD,na.rm=T)]

但这需要几分钟。 有什么办法可以优化这个代码/比rowMeans更快的解决方案?

【问题讨论】:

  • rowMeans 计算行总和?为什么会这样?
  • 您只需DT[,sums:= rowSums(.SD,na.rm=TRUE)]
  • 请记住,data.table 仍然是 data.frame,因此您仍然可以使用与 data.frame 对象相同的方法对其应用
  • 正如@Seymour 所说,您仍然使用 data.frame 的事实可能会使其变慢。尝试将您的 data.frame 转换为矩阵。我在一些辩论中看到它使计算更快。
  • @DJV 你所说的绝对是真的!将其转换为矩阵使其速度成倍增长!

标签: r optimization datatable


【解决方案1】:

关于@Seymour cmets 和我的。

比较data.table和matrix:

require(rbenchmark)
require(data.table)

#Sample data
  set.seed(1)
  DT_df <- data.table(a = rnorm(4000000), b = rnorm(4000000), c = rnorm(4000000), 
                   d = rnorm(4000000), e = rnorm(4000000))
  set.seed(1)
  DT_Matrix <- matrix(rexp(2e+07, rate=.1), ncol=5)

#Benchmark
    benchmark("data.table" = {
    DT_df[,sums:= rowMeans(.SD,na.rm=T)]
  },
  "Matrix" = {
    cbind(DT_Matrix, rowMeans(DT_Matrix, na.rm=T))
    },
  replications = 1000,
  columns = c("test", "replications", "elapsed",
              "relative", "user.self", "sys.self")) 

结果:

        test replications elapsed relative user.self sys.self
1 data.table         1000  264.30    1.146    254.08     7.78
2     Matrix         1000  230.64    1.000    213.72    16.29

【讨论】:

  • 谢谢,这很有帮助,但对我来说是一种解决方法,因为稍后我将不得不再次转换为数据表,并且在转换为矩阵之前,我必须删除一些列。如果这是唯一的方法,我会这样做(我还不能投票给你,因为我的声望不到 15)
  • 很高兴能帮上忙 :)。我也不知道我是否会做这个解决方法。我的想法是我需要来回转换多少次(这也需要时间),文件/变量有多大,也许包装在一个函数下会使其更快(通常会)。此外,众所周知,data.tables 无论如何都很快 - 尝试阅读教程/语法。也许你能找到更快的东西(?)
猜你喜欢
  • 1970-01-01
  • 2018-07-25
  • 2013-07-22
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多