gpt4 book ai didi

r - dplyr::group_by_ 带有几个变量名的字符串输入

转载 作者:行者123 更新时间:2023-12-03 11:27:59 26 4
gpt4 key购买 nike

我正在编写一个函数,要求用户在函数调用中定义一个或多个分组变量。然后使用 dplyr 对数据进行分组,如果只有一个分组变量,它会按预期工作,但我还没有想出如何使用多个分组变量进行分组。

例子:

x <- c("cyl")
y <- c("cyl", "gear")
dots <- list(~cyl, ~gear)

library(dplyr)
library(lazyeval)

mtcars %>% group_by_(x) # groups by cyl
mtcars %>% group_by_(y) # groups only by cyl (not gear)
mtcars %>% group_by_(.dots = dots) # groups by cyl and gear, this is what I want.

我试着转 ydots使用:
mtcars %>% group_by_(.dots = interp(~var, var = list(y)))
#Error: is.call(expr) || is.name(expr) || is.atomic(expr) is not TRUE

如何使用 > 1 个变量名的用户定义输入字符串(如示例中的 y)使用 dplyr 对数据进行分组?

(这个问题在某种程度上与 this one 有关,但没有在那里回答。)

最佳答案

不需要 interp在这里,只需使用 as.formula将字符串转换为公式:

dots = sapply(y, . %>% {as.formula(paste0('~', .))})
mtcars %>% group_by_(.dots = dots)

您的原因 interp方法不起作用是该表达式返回以下内容:
~list(c("cyl", "gear"))

——不是你想要的。你当然可以, sapply interpy ,这类似于使用 as.formula以上:
dots1 = sapply(y, . %>% {interp(~var, var = .)})

但是,其实你也可以直接通过y :
mtcars %>% group_by_(.dots = y)

dplyr vignette on non-standard evaluation更详细地解释了这些方法之间的区别。

关于r - dplyr::group_by_ 带有几个变量名的字符串输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27688193/

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