gpt4 book ai didi

R 聚合动态添加的列,每个列都有一个单独的函数

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

我有一个这样的数据框:

id  v    t1   t2  t3    t4   date1        list1

1 1.0 1.4 2 0.45 3 2020-09-03 val1
1 1.0 1.6 3 0.55 3.7 2020-09-05 val2
我如何按 id, v 分组并聚合列 t1, t2, t3, t4, date1, list1通过对它们中的每一个应用不同的聚合函数。进一步来说
t1 -> mean
t2 -> max
t3 -> mean
t4 -> max
date -> max
list1 -> join as in python's ','.join
所以聚合后的框架看起来像:
id  v    t1   t2  t3    t4   date1        list1

1 1.0 1.5 3 0.5 3.7 2020-09-05 val1, val2
还有一件事是,这些列可以根据用户在 R Shiny 框架中的选择动态添加,这意味着我打算聚合的所有这些列都在数据框中,但其中一些可能不需要聚合,例如用户只能选择 t1, date1而不是剩下的。所以我的聚合参数取决于所选的列,我确实有用户选择的列名。所以如果我问我如何构建动态聚合查询可能是有道理的。
在 python 中,我可以根据用户选择的列动态构建一个像上面那样的字典,并使用类似 pd.agg(**dict) 的东西。
我怎样才能在 R 中做到这一点?我试图查看 dplyr::summarise 和 data.table 但我似乎无法一次汇总所有这些。谢谢你的帮助。

最佳答案

我们可以使用 across在列块上应用函数

library(dplyr)
df1 %>%
group_by(id, v) %>%
summarise(across(c(t1, t3), mean),
across(c(t2, t4, date1), max),
list1 = toString(list1), .groups = 'drop')
-输出
# A tibble: 1 x 8
# id v t1 t3 t2 t4 date1 list1
# <int> <dbl> <dbl> <dbl> <int> <dbl> <chr> <chr>
#1 1 1 1.5 0.5 3 3.7 2020-09-05 val1, val2

如果函数、列名都是用户输入
nm1 <- c("t1", "t3")
nm2 <- c("t2", "t4", "date1")
nm3 <- c("list1")

f1 <- "mean"
f2 <- "max"
f3 <- "toString"

df1 %>%
group_by(id, v) %>%
summarise(across(all_of(nm1), ~ match.fun(f1)(.)),
across(all_of(nm2), ~ match.fun(f2)(.)),
!! nm3 := match.fun(f3)(!! rlang::sym(nm3)), .groups = 'drop')
-输出
# A tibble: 1 x 8
# id v t1 t3 t2 t4 date1 list1
# <int> <dbl> <dbl> <dbl> <int> <dbl> <date> <chr>
#1 1 1 1.5 0.5 3 3.7 2020-09-05 val1, val2

它也可以作为表达式传递并计算
expr1 <- glue::glue('across(c({toString(nm1)}), {f1});',
'across(c({toString(nm2)}), {f2});',
'across(c({toString(nm3)}), {f3})')
df1 %>%
group_by(id, v) %>%
summarise(!!! rlang::parse_exprs(expr1), .groups = 'drop')
-输出
# A tibble: 1 x 8
# id v t1 t3 t2 t4 date1 list1
# <int> <dbl> <dbl> <dbl> <int> <dbl> <date> <chr>
#1 1 1 1.5 0.5 3 3.7 2020-09-05 val1, val2
数据
df1 <- structure(list(id = c(1L, 1L), v = c(1, 1), t1 = c(1.4, 1.6), 
t2 = 2:3, t3 = c(0.45, 0.55), t4 = c(3, 3.7), date1 = structure(c(18508,
18510), class = "Date"), list1 = c("val1", "val2")), row.names = c(NA,
-2L), class = "data.frame")

关于R 聚合动态添加的列,每个列都有一个单独的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64849927/

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