我的实验设计有在各种森林中测量的树木,并在多年中重复测量。
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)。我需要经常进行一些小的修改来重复它,这需要很多时间。
答案 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