我希望你做得很好。我想知道如何计算具有某些条件的数据集的累积和。我的数据集的简化版本如下:
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
关于如何做到这一点的任何想法?提前谢谢。
答案 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))
}