我有以下数据框。
data <- data.frame(unit= c(1,1,1,1,1,1,1,1,2,2,2,2,2),
val= c(100,200,300,1200,1200,1200,1200,2000,100,100,100,1000,1100),
fin = c(100,200,300,525,750,975,1200,2000,100,400,700,1000,1100))
因为,1200来了4倍然后步长=(上限 - 下限)/计数(相同的值)。 当连续值相对于列“单位”多次出现(列 - “val”)时,则在这些值之间平均分配该范围。预期的输出应该像列“fin”。
答案 0 :(得分:0)
我们可以使用data.table
执行此操作。将'data.frame'转换为'data.table'(setDT(data)
),创建两列'lag'和'lead'值'val'('val1','val2')按'单位'分组“
library(data.table)
setDT(data)[, c('val1', 'val2') := .(shift(val), shift(val, type = "lead")), .(unit)]
获取行数索引(.I
),其中行数大于1(.N > 1
),按“单位”分组,行程长度为rleid
) 'VAL'。
i1 <- data[, .I[.N > 1], .(unit, grp = rleid(val))]$V1
使用上面的分组变量,并将i
指定为'i1',我们检查'val1'的第一个元素是否为NA
,在这种情况下,从第一个元素创建一个序列'val1'的元素增量by
'val'和'val1'的第一个元素之差除以行数或else
从'val'的第一个元素增加{{1} 'val2'的最后一个元素与'val'的第一个元素之差除以元素数
by