gpt4 book ai didi

r - R 中值的累积计数

转载 作者:行者123 更新时间:2023-12-05 01:08:21 24 4
gpt4 key购买 nike

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

时间
一个 22
一个 22
22
一个 41
一个 98
一个 98
一个 98
98
一个 46
一个 46
46
一个 46
一个 46
一个 46
46
一个 46
一个 12
54
一个 66
13
一个 13
一个 13
一个 13
一个 13
13
一个 13

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

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

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

最佳答案

使用 rle :

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

如果您的 data.frame不止这两列,你想只检查这两列,那么,只需替换 dfdf[, 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))
}

关于r - R 中值的累积计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17245349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com