我有一个data.frame(DF),如下所示:
[ID] [Value]
[1] ID_1 5
[2] ID_2 6
[3] ID_2 9
[4] ID_3 1
[5] ID_3 445
[6] ID_3 10
etc.
我需要的是通过ID列对观察结果进行核心化(向后),以便解决方案看起来像:
[ID] [Value] [Observation]
[1] ID_1 5 1
[2] ID_2 6 2
[3] ID_2 9 1
[4] ID_3 1 3
[5] ID_3 445 2
[6] ID_3 10 1
etc.
所有这些都是灵活的,因为观察的数量可能不同。如果可能的话会很棒 使用基础R解决方案。 我找到了一个从1开始计算的解决方案:
DF$Observation<-do.call(c, lapply(unique(DF$ID), function(enum){
seq(sum(DF$ID==enum))
}))
好吧,如果它以任何方式帮助原始数据存储在列表中,每个&#34; ID _&#34;作为num矢量。 也许从这里开始更简单,并且将代码保存在&#34;向后&#34;顺序。
myList <- list(ID_1 = 5, ID_2=c(6,9),ID_3=c(1,445,10))
答案 0 :(得分:3)
我们可以尝试ave
DF$Observation <- with(DF, ave(Value, ID, FUN= function(x) rev(seq_along(x))))
DF$Observation
#[1] 1 2 1 3 2 1
DF <- data.frame(ID=c('ID_1', 'ID_2', 'ID_2', 'ID_3', 'ID_3', 'ID_3'),
Value=c(5,6,9,1, 445, 10), stringsAsFactors=FALSE)