gpt4 book ai didi

r - 从 R 中每个组第一次越过阈值的列中获取值

转载 作者:行者123 更新时间:2023-12-01 00:18:35 25 4
gpt4 key购买 nike

我有很多人的交易 list 。我想知道每个特定的人何时超过了总交易量的特定阈值。

这是我已经做过的一个例子:
示例数据集:

df <- data.frame(name = rep(c("a","b"),4), 
dates = seq(as.Date("2017-01-01"), by = "month", length.out = 8), amt = 11:18)
setorderv(df, "name")

这给了我以下数据框
  name      dates amt
1 a 2017-01-01 11
3 a 2017-03-01 13
5 a 2017-05-01 15
7 a 2017-07-01 17
2 b 2017-02-01 12
4 b 2017-04-01 14
6 b 2017-06-01 16
8 b 2017-08-01 18

然后我编写了以下代码来查找累积和
df$cumsum <- ave(df$amt, df$name, FUN = cumsum)

这给了我以下数据框:
  name      dates amt cumsum
1 a 2017-01-01 11 11
3 a 2017-03-01 13 24
5 a 2017-05-01 15 39
7 a 2017-07-01 17 56
2 b 2017-02-01 12 12
4 b 2017-04-01 14 26
6 b 2017-06-01 16 42
8 b 2017-08-01 18 60

现在我想知道每个人何时跨过 20 和 40。我编写了以下代码来找出答案:
names <- unique(df$name)    
for (i in seq_along(names)){
x1 <- Position(function(x) x >= 20, df$cumsum[df$name == names[i]])
x2 <- Position(function(x) x >= 40, df$cumsum[df$name == names[i]])

result_df[i,] <- c(df$name[i],
df[df$name == names[i],2][x1],
df[df$name == names[i],2][x2])
}

此代码检查越过阈值的位置并将行号存储在变量中。然后从第二列的该行中提取值并将其存储在另一个数据框中。

问题是,这段代码真的很慢。我的数据集中有超过 200,000 人,超过 1000 万行。前 50 个用户执行此代码大约需要 25 秒,这意味着整个数据集可能需要大约 30 小时。

有没有更快的方法来做到这一点?

最佳答案

使用 dplyr 您可以按人分组,当 cumsum 大于 >20 或大于 >40 时进行过滤,然后使用 slice(1) 选择每人的第一个相关行。应该比 for 循环快得多。

df <- read.table(text = '
name dates amt cumsum
a 2017-01-01 11 11
a 2017-03-01 13 24
a 2017-05-01 15 39
a 2017-07-01 17 56
b 2017-02-01 12 12
b 2017-04-01 14 26
b 2017-06-01 16 42
b 2017-08-01 18 60', header = T)

df %>%
group_by(name) %>%
filter(cumsum > 20) %>%
slice(1)

name dates amt cumsum
<fctr> <fctr> <int> <int>
1 a 2017-03-01 13 24
2 b 2017-04-01 14 26

df %>%
group_by(name) %>%
filter(cumsum > 40) %>%
slice(1)

name dates amt cumsum
<fctr> <fctr> <int> <int>
a 2017-07-01 17 56
b 2017-06-01 16 42

当然,您随后可以 rbind 这些数据帧并安排在人身上。这有帮助吗?

关于r - 从 R 中每个组第一次越过阈值的列中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50526913/

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