gpt4 book ai didi

用累积和 reshape data.table

转载 作者:行者123 更新时间:2023-12-04 11:35:19 25 4
gpt4 key购买 nike

我想 reshape 一个 data.table,并包含每个变量的历史(累计)信息。 No变量表示对象 ID 的测量时间顺序.在每次测量中都会发现附加信息。我想汇总每个时间戳的已知信息 No对象 ID .

让我用一个例子来演示:

对于以下数据表:

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

我想将其 reshape 为:
       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 .

我可以通过做得到没有累积部分的结果
dcast(df, ID+No~Variable, value.var="Value")

这导致非累积变体:
   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

任何想法如何使这个累积?原始 data.table 有超过 250,000 行,因此效率很重要。

编辑:我只是以 a,b,c 为例,原始文件有大约 40 个不同的级别。此外, NA s 很重要;还有 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 改进了我在完整数据集中计算时间的解决方案(Eddi 为 2.08 秒,而我的为 4.36 秒)。这些是我可以使用的数字!谢谢大家!

最佳答案

您的解决方案很好,但是您添加了太多行,如果您计算 cumsum,则这是不必要的预先:

# add useful columns
df[, TotalNo := .N, by = ID][, CumValue := cumsum(Value), by = .(ID, Variable)]

# do a rolling join to extend the missing values, and then dcast
dcast(df[df[, .(No = seq(No[1], TotalNo[1])), by = .(ID, Variable)],
on = c('ID', 'Variable', 'No'), roll = TRUE],
ID + No ~ Variable, value.var = 'CumValue')
# 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

关于用累积和 reshape data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37004296/

25 4 0