我想重塑一个data.table,并包含每个变量的历史(累计求和)信息。变量No
指示对象ID
的测量时间顺序。每次测量都会找到附加信息。我想汇总每个时间戳No
处的对象ID
的已知信息。用累计金额重塑data.table
让我用一个例子证明:
对于以下data.table:
df <- data.table(ID=c(1,1,1,2,2,2,2),
No=c(1,2,3,1,2,3,4),
Variable=c('a','b', 'a', 'c', 'a', 'a', 'b'),
Value=c(2,1,3,3,2,1,5))
df
ID No Variable Value
1: 1 1 a 2
2: 1 2 b 1
3: 1 3 a 3
4: 2 1 c 3
5: 2 2 a 2
6: 2 3 a 1
7: 2 4 b 5
我想它重塑这个:
ID No a b c
1: 1 1 2 NA NA
2: 1 2 2 1 NA
3: 1 3 5 1 NA
4: 2 1 NA NA 3
5: 2 2 2 NA 3
6: 2 3 3 NA 3
7: 2 4 3 5 3
所以Value
的总和值,每Variable
(ID, No)
,累计超过No
。
ID No a b c
1: 1 1 2 NA NA
2: 1 2 NA 1 NA
3: 1 3 3 NA NA
4: 2 1 NA NA 3
5: 2 2 2 NA NA
6: 2 3 1 NA NA
7: 2 4 NA 5 NA
任何想法如何使这个累积:
我可以通过做
dcast(df, ID+No~Variable, value.var="Value")
这会导致非累积变异获得不累积部分的结果?原始data.table有超过250,000行,所以效率很重要。
编辑:我只是用a,b,c作为例子,原始文件有大约40个不同的级别。此外,NA
是重要的;也有Value
- 值0,这意味着比NA
可能的解决方案
好了别的东西,所以我找到了一个可行的解决方案。它远没有效率,因为它扩大了原来的桌子。
这个想法是复制每一行TotalNo - No
次,其中TotalNo
是最大No
每ID
。然后,可以使用原始dcast函数来提取数据帧。所以在代码中:
df[,TotalNo := .N, by=ID]
df2 <- df[rep(seq(nrow(df)), (df$TotalNo - df$No + 1))] #create duplicates
df3 <- df2[order(ID, No)]#, No:= seq_len(.N), by=.(ID, No)]
df3[,No:= seq(from=No[1], to=TotalNo[1], by=1), by=.(ID, No)]
df4<- dcast(df3,
formula = ID + No ~ Variable,
value.var = "Value", fill=NA, fun.aggregate = sum)
这不是很好,因为重复的创建使用更多的内存。我认为它可以进一步优化,但到目前为止它适用于我的目的。在示例代码中,它从7行到16行,原始文件从241,670行到978,331。这超过了4倍。
解决方案 Eddi改进了我在完整数据集中的计算时间的解决方案(2.02秒的Eddi与4.36秒的雷区)。这些是我可以合作的数字!谢谢大家!
你可能做'的cols < - 排序(独特的(DF $变量) ); res < - dcast(df,ID + No〜Variable,value.var =“Value”,fill = 0L)[,(cols):= lapply(.SD,cumsum),.SDcols = cols,by = ID]'如果你不介意有零而不是'NA' –
零不是一个选项;也有0的值具有与NA不同的含义。感谢您的贡献! –