在R

时间:2015-10-21 07:19:14

标签: r

我有一个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))

1 个答案:

答案 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)