【发布时间】:2020-11-22 16:38:16
【问题描述】:
假设我有一个这样的数据集:
trt <- data.table(group = rep(c("a","b"), each = 5),
val1= c(60,62,NA,NA,71, NA, 21,22,NA,25),
val2 = c(1,1,1,NA,2, 1,1,NA,NA,2),
reflev = rep(c(1.01, 1.03, 1.061, 1.104,1.159), 2))
trt[ , ref:= round(reflev/shift(reflev), 2), by = group]
> trt
group val1 val2 reflev ref
1: a 60 1 1.010 NA
2: a 62 1 1.030 1.02
3: a NA 1 1.061 1.03
4: a NA NA 1.104 1.04
5: a 71 2 1.159 1.05
6: b NA 1 1.010 NA
7: b 21 1 1.030 1.02
8: b 22 NA 1.061 1.03
9: b NA NA 1.104 1.04
10: b 25 2 1.159 1.05
在每个组中,我想通过将之前的可用值(例如 shift(val1) 或 lag(val1))与ref 列中的值。如果在一个非 NA 值之后有多个 NA 出现在一个序列中,则应使用之前的插值作为起点对它们进行插值。
所以,这是我想象的计算方式:
group val1 val2 reflev ref
1: a 60 1 1.010 NA
2: a 62 1 1.030 1.02
3: a 62*1.03 1 1.061 1.03
4: a 62*1.03*1.04 1*1.04 1.104 1.04
5: a 71 2 1.159 1.05
6: b NA 1 1.010 NA
7: b 21 1 1.030 1.02
8: b 22 1*1.03 1.061 1.03
9: b 22*1.04 1*1.03*1.04 1.104 1.04
10: b 25 2 1.159 1.05
有什么想法吗?我能想到的一切都非常肮脏,并且会涉及两个循环,一个用于组,一个用于所需的列。
【问题讨论】:
-
如果
ref和val1都是NA怎么办?如果val1[1]是NA怎么办? -
在这些情况下,不可能/不需要插值,因此这些 NA 应该保持 NA
标签: r time-series data.table interpolation na