gpt4 book ai didi

r - 在 dplyr 中的 mutate 中应用过滤器时保持 group_by 机智

转载 作者:行者123 更新时间:2023-12-04 08:34:26 25 4
gpt4 key购买 nike

我正在尝试在 mutate 中应用过滤器,但我还没有想出在保持数据框分组机智的同时应用过滤器的正确方法。
这是一个简单的可重现示例:

# Sample data
my_dates = seq(as.Date("2020/1/1"), by = "month", length.out = 6)
grp = c(rep("A",3), rep("B", 3))
x = c(2,4,6,8,10,12)

my_df <- data.frame(my_dates, grp, x)

my_dates grp x
1 2020-01-01 A 2
2 2020-02-01 A 4
3 2020-03-01 A 6
4 2020-04-01 B 8
5 2020-05-01 B 10
6 2020-06-01 B 12


# Pick a max date for which the data will be filtered
max_date <- "2020-05-01"


# Try to get the average by group, after filtering out the max date included
filt_data <- my_df %>%
group_by(grp) %>%
mutate(included_data = my_dates < max_date,
my_mean = mean(filter(., my_dates < max_date)$x)
)


# A tibble: 6 x 5
# Groups: grp [2]
my_dates grp x included_data my_mean
<date> <fct> <dbl> <lgl> <dbl>
1 2020-01-01 A 2 TRUE 5
2 2020-02-01 A 4 TRUE 5
3 2020-03-01 A 6 TRUE 5
4 2020-04-01 B 8 TRUE 5
5 2020-05-01 B 10 FALSE 5
6 2020-06-01 B 12 FALSE 5
我希望得到的输出是这样的,其中 的平均值包含数据对于 A 组 = 均值 (2,4,6) = 4 和 的均值包含数据对于 B 组 = mean(8) = 8:
  my_dates   grp       x included_data my_mean
<date> <fct> <dbl> <lgl> <dbl>
1 2020-01-01 A 2 TRUE 4
2 2020-02-01 A 4 TRUE 4
3 2020-03-01 A 6 TRUE 4
4 2020-04-01 B 8 TRUE 8
5 2020-05-01 B 10 FALSE 8
6 2020-06-01 B 12 FALSE 8
我不确定正确的 mutate 和过滤器是什么,因此感谢您的帮助,同时解释为什么上述内容无法按预期工作。
谢谢!

最佳答案

在这里,最好使用 'included_data' 中的索引来对 'x' 列进行子集化,而不是再做一次 filter

library(dplyr)
my_df %>%
group_by(grp) %>%
mutate(included_data = my_dates < max_date,
my_mean = mean(x[included_data])) %>%
ungroup
-输出
# A tibble: 6 x 5
# my_dates grp x included_data my_mean
# <date> <chr> <dbl> <lgl> <dbl>
#1 2020-01-01 A 2 TRUE 4
#2 2020-02-01 A 4 TRUE 4
#3 2020-03-01 A 6 TRUE 4
#4 2020-04-01 B 8 TRUE 8
#5 2020-05-01 B 10 FALSE 8
#6 2020-06-01 B 12 FALSE 8

关于为什么 OP 的代码不起作用, .是完整数据集,它正在从完整数据而不是分组数据中提取子集。我们可以使用 cur_data()而不是 .
my_df %>%
group_by(grp) %>%
mutate(included_data = my_dates < max_date,
my_mean = mean(filter(cur_data(), my_dates < max_date)$x)) %>%
ungroup
# A tibble: 6 x 5
# my_dates grp x included_data my_mean
# <date> <chr> <dbl> <lgl> <dbl>
#1 2020-01-01 A 2 TRUE 4
#2 2020-02-01 A 4 TRUE 4
#3 2020-03-01 A 6 TRUE 4
#4 2020-04-01 B 8 TRUE 8
#5 2020-05-01 B 10 FALSE 8
#6 2020-06-01 B 12 FALSE 8

关于r - 在 dplyr 中的 mutate 中应用过滤器时保持 group_by 机智,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64866559/

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