gpt4 book ai didi

r - 在 dplyr 中为 group_by 调用变量名称的函数 - 如何在函数中对这个变量进行矢量化?

转载 作者:行者123 更新时间:2023-12-04 10:30:12 24 4
gpt4 key购买 nike

我在 R 中创建了一个函数采用固定数据帧并使用 dplyr给我按所选参数变量分组的汇总统计数据(例如,特定变量的平均值)。这是一些显示玩具数据框和我的功能的代码:

#Create data frame for analysis
DF <- data.frame(Type1 = c(0,0,1,1,0,1,1,0,1,0,1,1,1,0),
Type2 = c(1,1,1,1,1,1,2,2,2,2,3,3,3,3),
Output = c(4,2,7,5,1,1,7,8,3,2,5,4,3,6));

#Inspect the data-frame
DF;

Type1 Type2 Output
1 0 1 4
2 0 1 2
3 1 1 7
4 1 1 5
5 0 1 1
6 1 1 1
7 1 2 7
8 0 2 8
9 1 2 3
10 0 2 2
11 1 3 5
12 1 3 4
13 1 3 3
14 0 3 6

#Create a function that summarises the mean output grouped by input variable
MEAN_OUT <- function(VAR) { DF %>% group_by(!! sym(VAR)) %>%
summarise(Mean = mean(Output)) %>%
as.data.frame(); }

#Call the function grouping by variable 'Type1'
MEAN_OUT('Type1')

Type1 Mean
1 0 3.714286
2 1 4.444444

目前我可以调用 MEAN_OUT('Type1')MEAN_OUT('Type2')这些给了我按这些参数变量中的任何一个分组的正确摘要。不过,我也想调用 MEAN_OUT(c('Type1','Type2'))获得对两个变量进行分组的摘要。您可以在 dplyr::group_by 中执行此操作功能,但是当这种 Material 包装在我的功能中时,我不知道该怎么做。如果我使用我现在的函数(如上所示)尝试按两个变量进行分组,我会收到以下错误:
MEAN_OUT(c('Type1','Type2'))
Error: Only strings can be converted to symbols

最佳答案

最好使用syms如果打算将多个分组变量作为 vector 传递

library(dplyr)
library(rlang)
MEAN_OUT <- function(VARS) {
DF %>%
group_by(!!! syms(VARS)) %>%
summarise(Mean = mean(Output)) %>%
as.data.frame()
}

但是,我们可以使用 group_by_at可以将字符串作为输入避免 syms和评估 ( !!!)
MEAN_OUT2 <- function(VARS) {
DF %>%
group_by_at(VARS) %>%
summarise(Mean = mean(Output)) %>%
as.data.frame()
}

-测试
identical(MEAN_OUT('Type1'), MEAN_OUT2('Type1'))
#[1] TRUE

identical(MEAN_OUT(c('Type1', 'Type2')), MEAN_OUT2(c('Type1', 'Type2')))
#[1] TRUE

除了作为带引号的字符串传递,还有其他选项可以作为 quosure 传递
MEAN_OUT3 <- function(VARS) {
DF %>%
group_by(!!! VARS) %>%
summarise(Mean = mean(Output)) %>%
as.data.frame()
}

identical(MEAN_OUT('Type1'), MEAN_OUT3(quos(Type1)))
#[1] TRUE
identical(MEAN_OUT(c('Type1', 'Type2')), MEAN_OUT3(quos(Type1, Type2)))
#[1] TRUE

或调用 quos通过将参数传递为 ... 在函数内部
MEAN_OUT4 <- function(...) {

DF %>%
group_by(!!! quos(...)) %>%
summarise(Mean = mean(Output)) %>%
as.data.frame()
}

identical(MEAN_OUT('Type1'), MEAN_OUT4(Type1))
#[1] TRUE

identical(MEAN_OUT(c('Type1', 'Type2')), MEAN_OUT4(Type1, Type2))
#[1] TRUE

关于r - 在 dplyr 中为 group_by 调用变量名称的函数 - 如何在函数中对这个变量进行矢量化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52437463/

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