首页 > 解决方案 > 为R中分类变量的连续观察添加计数器?

问题描述

我有一个数据框,其中一个变量对我的观察结果(ID)和另一个分类变量(类型)进行分组。我在 R 中工作,并试图创建一个新变量来计算 ID 中相同类型的连续观察值(数据是时间序列)。请参阅下面的示例表 - Counter 是我要创建的变量。是否计算 0 并不重要。

dat <- data.frame(id = c(rep("a", 7), rep("b", 4)),
                  type = c(0, 1, 1, 2, 2, 0, 1, 1, 1, 2, 0),
                  counter = c(0, 1, 2, 1, 2, 0, 1, 1, 2, 1, 0))

到目前为止,我能够制作计数器,虽然可能不是以最有效的方式,但我正在努力在分组 (ID) 中这样做并有效地在 type = 1 和 type = 2 之间切换。我编写的代码是计数器在下面。关于如何有效地做到这一点的任何想法?谢谢。

dat$counter <- 0
counter     <- 0
for(i in 1:nrow(dat)){
  if(dat[i,"type"] != 0){
    counter <- counter + 1
    dat[i,"count"] <- counter
    # use to differentiate between 1 and 2?
    this_group <- dat[i,"type"]
  }
  if(dat[i,"type"] == 0){
    counter <- 0
  }
}

标签: rdataframefor-loopdata-cleaning

解决方案


对于从 0 开始的每一idtype和连续行,使用andtype创建一个序列。不使用任何软件包:aveseq_along

transform(dat, 
  counter = (type > 0) * ave(type, id, type, cumsum(type == 0), FUN = seq_along))

给予:

   id type counter
1   a    0       0
2   a    1       1
3   a    1       2
4   a    2       1
5   a    2       2
6   a    0       0
7   a    1       1
8   b    1       1
9   b    1       2
10  b    2       1
11  b    0       0

推荐阅读