data.table r中按组的慢功能

时间:2019-03-20 14:34:15

标签: r function data.table

我的实验设计有在各种森林中测量的树木,并在多年中重复测量。

addCookie

对于每棵树i,我想计算一个新变量,该变量等于同一组/年中大于树i的所有其他个体的大小之和。

我创建了以下功能:

export class ListOverviewExample {
  items = ['item 1', 'item 2', 'item 3'];

  addCookie() {
    console.log("here I would like to paste the value of the input field");
  }
}

在数据表中应用时,我得到了正确的结果。

DT <- data.table(forest=rep(c("a","b"),each=6),
                    year=rep(c("2000","2010"),each=3),
                    id=c("1","2","3"),
                    size=(1:12))

DT[,id:=paste0(forest,id)]

> DT
    forest year id size
 1:     a 2000 a1     1
 2:     a 2000 a2     2
 3:     a 2000 a3     3
 4:     a 2010 a1     4
 5:     a 2010 a2     5
 6:     a 2010 a3     6
 7:     b 2000 b1     7
 8:     b 2000 b2     8
 9:     b 2000 b3     9
10:     b 2010 b1    10
11:     b 2010 b2    11
12:     b 2010 b3    12

请注意,我有一个大型数据集,其中包含几个森林(40个)和重复年(6个)和单个个体(20,000个),总共进行了将近50,000次测量。当我执行上述功能时,需要8-10分钟(Windows 7,i5-6300U CPU @ 2.40 GHz 2.40 GHz,RAM 8 GB)。我需要经常进行一些小的修改来重复它,这需要很多时间。

  1. 有没有更快的方法?我检查了* apply函数,但无法找到基于它们的解决方案。
  2. 我可以创建不依赖于数据集特定结构的通用函数吗(即我可以使用“大小”不同的列)?

1 个答案:

答案 0 :(得分:2)

只需对数据进行排序,这可能会非常快:

setorder(DT, forest, year, -size)
DT[, new := cumsum(size) - size, by = .(forest, year)]
setorder(DT, forest, year, id)
DT
#    forest year id size new
# 1:      a 2000 a1    1   5
# 2:      a 2000 a2    2   3
# 3:      a 2000 a3    3   0
# 4:      a 2010 a1    4  11
# 5:      a 2010 a2    5   6
# 6:      a 2010 a3    6   0
# 7:      b 2000 b1    7  17
# 8:      b 2000 b2    8   9
# 9:      b 2000 b3    9   0
#10:      b 2010 b1   10  23
#11:      b 2010 b2   11  12
#12:      b 2010 b3   12   0