gpt4 book ai didi

r - 在 R 中跟踪时间序列数据表的变化

转载 作者:行者123 更新时间:2023-12-04 12:37:47 24 4
gpt4 key购买 nike

我有一个这样的data.table

library(data.table)
df = data.table(
id = c(rep(1, 3), rep(2, 4), rep(3, 2)),
time = c(seq(1, 3, 1), seq(1, 4, 1), seq(3, 4)),
value1 = c(0, 0, 0, 0, 2, 0, 0, 0, 1),
value2 = c(0, 1, 0, 1, 0, 0, 0, 0, 1)
)

像这样打印

    id   time   value1 value2
1: 1 1 0 0
2: 1 2 0 1
3: 1 3 0 0
4: 2 1 0 1
5: 2 2 2 0
6: 2 3 0 0
7: 2 4 0 0
8: 3 3 0 0
9: 3 4 1 1

现在我想创建两个新列来跟踪每个 id 的值列中最后一个非零值的时间。 IE。我想要一个结果数据表如下

    id   time   value1  last_change1  value2  last_change2
1: 1 1 0 NA 0 NA
2: 1 2 0 NA 1 0
3: 1 3 0 NA 0 1
4: 2 1 0 NA 1 0
5: 2 2 2 0 0 1
6: 2 3 0 1 0 2
7: 2 4 0 2 0 3
8: 3 3 0 NA 0 NA
9: 3 4 1 0 1 0

有人对此有好的解决方案吗?

最佳答案

一种选择是使用 zoo::na.locf 来填充 占位符中最后一个 非零 值的行号(组特定) >0value 列的相应行中。最后,从当前行号中减去最后一个非零row-number(group-wise e.g. .I-.I[1]+1)。

library(data.table)
library(zoo)

df[, c("last_change1", "last_change2") :=
lapply(.SD, function(x){as.integer((.I-.I[1]+1) - na.locf(as.integer(ifelse(x == 0, NA_integer_, .I-.I[1]+1)), na.rm = FALSE))}),
.SDcols = value1:value2, by=id]

已编辑:根据 @DavidArenburg 的建议添加了简化版本

df[, c("last_change1", "last_change2") := 
lapply(.SD, function(x){.I - na.locf(ifelse(x == 0, NA_integer_, .I), na.rm = FALSE)}),
.SDcols = value1:value2, by=id]


#Modified df
df
# id time value1 value2 last_change1 last_change2
# 1: 1 1 0 0 NA NA
# 2: 1 2 0 1 NA 0
# 3: 1 3 0 0 NA 1
# 4: 2 1 0 1 NA 0
# 5: 2 2 2 0 0 1
# 6: 2 3 0 0 1 2
# 7: 2 4 0 0 2 3
# 8: 3 3 0 0 NA NA
# 9: 3 4 1 1 0 0

关于r - 在 R 中跟踪时间序列数据表的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50568603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com