gpt4 book ai didi

R按条件累计总和并重置

转载 作者:行者123 更新时间:2023-12-03 15:05:30 25 4
gpt4 key购买 nike

我在 data.frame 中有一个数字向量,如下所示。

df <- data.frame(a = c(1,2,3,4,2,3,4,5,8,9,10,1,2,1))

我需要创建一个新列,该列提供比其前任更大的条目的运行计数。结果列向量应该是这样的:
0,1,2,3,0,1,2,3,4,5,6,0,1,0

我的尝试是创建一个差异的“标志”列来标记值何时更大。
df$flag <- c(0,diff(df$a)>0)
> df$flag
[1] 0 1 1 1 0 1 1 1 1 1 1 0 1 0

然后我可以应用一些 dplyr group/sum 魔法来几乎得到正确的答案,除了当 flag == 0 时总和不会重置:
df %>% group_by(flag) %>% mutate(run=cumsum(flag))

a flag run
1 1 0 0
2 2 1 1
3 3 1 2
4 4 1 3
5 2 0 0
6 3 1 4
7 4 1 5
8 5 1 6
9 8 1 7
10 9 1 8
11 10 1 9
12 1 0 0
13 2 1 10
14 1 0 0

我不想求助于 for() 循环,因为我有几个这样的运行总和要计算一个 data.frame 中的几十万行。

最佳答案

这是 ave 的一种方式:

ave(df$a, cumsum(c(F, diff(df$a) < 0)), FUN=seq_along) - 1
[1] 0 1 2 3 0 1 2 3 4 5 6 0 1 0

我们可以得到按 diff(df$a) < 0 分组的运行计数.哪些是向量中小于其前辈的位置。我们添加 c(F, ..)占第一位。该向量的累积总和创建了一个用于分组的索引。函数 ave可以对该索引执行函数,我们使用 seq_along进行计数。但由于它从 1 开始,我们减一 ave(...) - 1从零开始。

使用 dplyr 的类似方法:
library(dplyr)
df %>%
group_by(cumsum(c(FALSE, diff(a) < 0))) %>%
mutate(row_number() - 1)

关于R按条件累计总和并重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32994060/

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