4

我希望你做得很好。我想知道如何计算具有特定条件的数据集的累积和。我的数据集的简化版本如下所示:

时间标识  
22
22
22
41
98
98
98
98
46
46
46
46
46
46
46
46
12
R 54
66
13
13
13
13
13
13
13

想做一个新的数据集,对于“id”的每个值,我会有每个 id 出现的累积次数,但是当 t=RI 需要重新开始计数时,例如

t id 计数
一个 22 1
22 2
22 0
41 1
98 1
98 2
一个 98 3
98 0
一个 46 1
46 2
46 0
一个 46 1
46 2
46 3
46 0
一个 46 1
12 1
54 0
66 1
13 0
13 1
13 2
13 3
13 4
13 0
13 1

关于如何做到这一点的任何想法?提前致谢。

4

1 回答 1

5

使用rle

out <- transform(df, count = sequence(rle(do.call(paste, df))$lengths))
out$count[out$t == "R"] <- 0

如果您的data.frame列多于这两列,并且您只想检查这两列,则只需替换dfdf[, 1:2](or) df[, c("t", "id")]

如果您发现do.call(paste, df)危险(如@flodel 评论),那么您可以将其替换为:

as.character(interaction(df))

我个人认为这种设置没有任何危险或笨拙(只要你有正确的分隔符,这意味着你很了解你的数据)。但是,如果您确实找到了它,那么第二种解决方案可能会对您有所帮助。


更新:

对于那些不喜欢使用do.call(paste, df)or的人as.character(interaction(df))(请参阅我、@flodel 和 @HongOoi 之间的评论交流),这是另一个基本解决方案:

idx <- which(df$t == "R")
ww <- NULL
if (length(idx) > 0) {
    ww <- c(min(idx), diff(idx), nrow(df)-max(idx))
    df <- transform(df, count = ave(id, rep(seq_along(ww), ww), 
                   FUN=function(y) sequence(rle(y)$lengths)))
    df$count[idx] <- 0
} else {
    df$count <- seq_len(nrow(df))
}
于 2013-06-21T22:50:34.660 回答