我希望你做得很好。我想知道如何在一定条件下计算数据集的累积和。我的数据集的简化版本如下:
t idA 22A 22R 22A 41A 98A 98A 98R 98A 46A 46R 46A 46A 46A 46R 46A 46A 12R 54A 66R 13A 13A 13A 13A 13R 13A 13
我想创建一个新的数据集,其中,对于"id"的每个值,我都有每个id出现的累计次数,但当t=R时,我需要重新开始计数,例如
t id计数A 22 1A 22 2R 22 0A 41 1A 98 1A 982A 983R 98 0A 46 1A 46 2R 46 0A 46 1A 46 2A 46 3R 46 0A 46 1A 12 1R 54 0A 66 1R 13 0A 13 1A 13 2A 13 3A 13 4R 13 0A 13 1
关于如何做到这一点,有什么想法吗?提前谢谢。
使用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))
的人(请参阅我、@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))
}