gre*_*Bag 2 optimization r data.table
我使用的数据集结构如下:
library("data.table")
dt <- data.table(Id = c(1,2,3,4,5,6,7,8), "01.01.2005" = c(10,0,0,0,5,7,7,0),
"02.01.2005" = c(4,5,7,0,0,0,9,9), "03.01.2005" = c(2,3,3,6,7,77,45,0),
"04.01.2005" = c(0,0,0,0,0,0,0,1), "05.01.2005" = c(0,1,1,1,1,0,0,2),
"06.01.2005" = c(45,15,45,54,5,76,67,10), "07.01.2005" = c(0,0,0,0,466,21,832,54),
"08.01.2005" = c(2,3,734,2,3,4,5,6))
>dt
Id 01.01.2005 02.01.2005 03.01.2005 04.01.2005 05.01.2005 06.01.2005 07.01.2005 08.01.2005
1: 1 10 4 2 0 0 45 0 2
2: 2 0 5 3 0 1 15 0 3
3: 3 0 7 3 0 1 45 0 734
4: 4 0 0 6 0 1 54 0 2
5: 5 5 0 7 0 1 5 466 3
6: 6 7 0 77 0 0 76 21 4
7: 7 7 9 45 0 0 67 832 5
8: 8 0 9 0 1 2 10 54 6
Run Code Online (Sandbox Code Playgroud)
我需要通过一定的步骤来计算一列的数量.即,如果步骤= 2,则列(2,3)也被聚合,(4,5),(6,7)和(8,9).输出需要如下所示:
>output
Id 01.01.2005-02.01.2005 03.01.2005-04.01.2005 05.01.2005-06.01.2005 07.01.2005-08.01.2005
1: 1 14 2 45 2
2: 2 5 3 16 3
3: 3 7 3 46 734
4: 4 0 6 55 2
5: 5 5 7 6 469
6: 6 7 77 76 25
7: 7 16 45 67 837
8: 8 9 1 12 60
Run Code Online (Sandbox Code Playgroud)
要实现这一点,我使用循环:
output <- dt[, list(Id)]
step = 2
for(i in seq(nrow(dt), 2, by = -step)){
output <- cbind(output, temp.col = rowSums(dt[, i:(i-step+1), with = F],
na.rm = FALSE, dims = 1))
setnames(output, "temp.col", "new.name...")
}
Run Code Online (Sandbox Code Playgroud)
但是对于大型数据集,这种方法非常慢.是否存在能够在没有循环的情况下完成所需的功能?
此外:"步骤"需要是一个可变输入.
提前致谢
这是另一种可能的方法
step <- 2
temp <- melt(dt, "Id")[, indx := rep(seq_len((ncol(dt)-1L)/step), each = nrow(dt)*step)]
dcast(temp, Id ~ indx, sum, value.var = "value")
# Id 1 2 3 4
# 1: 1 14 2 45 2
# 2: 2 5 3 16 3
# 3: 3 7 3 46 734
# 4: 4 0 6 55 2
# 5: 5 5 7 6 469
# 6: 6 7 77 76 25
# 7: 7 16 45 67 837
# 8: 8 9 1 12 60
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |