R中值的累积计数

时间:2013-06-21 22:41:44

标签: r average cumulative-sum

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

t   id  
A   22
A   22
R   22
A   41
A   98
A   98
A   98
R   98
A   46
A   46
R   46
A   46
A   46
A   46
R   46
A   46
A   12
R   54
A   66
R   13 
A   13
A   13
A   13
A   13
R   13
A   13

想要创建一个新数据集,对于每个“id”值,我会得到每个id出现的累计次数,但是当t = R时,我需要重新开始计数,例如。

t   id  count
A   22  1
A   22  2
R   22  0
A   41  1
A   98  1
A   98  2
A   98  3
R   98  0
A   46  1
A   46  2
R   46  0
A   46  1
A   46  2
A   46  3
R   46  0
A   46  1
A   12  1
R   54  0
A   66  1
R   13  0
A   13  1
A   13  2
A   13  3
A   13  4
R   13  0
A   13  1

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

1 个答案:

答案 0 :(得分:5)

使用rle

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

如果您的data.frame包含的列数超过这两列,并且您只想检查这两列,那么只需将df替换为df[, 1:2](或)df[, c("t", "id")]

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

as.character(interaction(df))

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


更新

对于那些不喜欢使用do.call(paste, df)as.character(interaction(df))的人(请参阅我之间的评论交流,@ fldel和@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))
}