Using rle
:
out <- transform(df, count = sequence(rle(do.call(paste, df))$lengths))
out$count[out$t == "R"] <- 0
If your data.frame
不止这两列,而您只想检查这两列,那么,只需替换df
with df[, 1:2]
(or) df[, c("t", "id")]
.
如果你发现do.call(paste, df)
危险(如 @flodel 评论),那么你可以将其替换为:
as.character(interaction(df))
我个人认为这种设置没有任何危险或笨拙的地方(只要你有正确的分隔符,这意味着你很了解你的数据)。但是,如果您确实发现了这种情况,第二个解决方案可能会对您有所帮助。
Update:
对于那些不喜欢使用的人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))
}