【发布时间】:2020-05-13 17:32:48
【问题描述】:
在我之前的问题 here 的基础上,我希望能够使用 pivot_wider 引用列,但不清楚语法。
可重现的例子
例如,假设我们想要创建一个函数,它为我们提供以下等效输出,但 group_by 的输入是可变数字:
# String inputs
grp1 <- "cyl"
grp2 <- "carb"
# 2 variables input
mtcars %>%
group_by(.data[[grp1]], .data[[grp2]]) %>%
summarize(mean_hp = mean(hp, na.rm = TRUE)) %>%
pivot_wider(., names_from = .data[[grp1]], values_from = mean_hp)
# A tibble: 6 x 4
carb `4` `6` `8`
<dbl> <dbl> <dbl> <dbl>
1 1 77.4 108. NA
2 2 87 NA 162.
3 4 NA 116. 234
4 6 NA 175 NA
5 3 NA NA 180
6 8 NA NA 335
要获得可变数量的输入(即仅 grp1、grp1、grp2 和 grp 3),上一个问题指出解决方案是使用如下所示的省略号:
# String inputs
grp1 <- "cyl"
grp2 <- "carb"
# Create simple function
car_fx <- function(df, ...) {
output <- df %>%
group_by_at(c(...)) %>%
summarize(mean_hp = mean(hp, na.rm = TRUE))
}
# Works with variable number of inputs
(car_fx(mtcars, grp1, grp2))
(car_fx(mtcars, grp1))
在我的实际函数中,我还想对数据进行透视,并且通常使用第一个输入变量(例如 grp1),如上 pivot_wider 示例中所示。我将如何使用椭圆解决方案对可变数量的输入进行 pivot_wider?具体来说,我将如何仅使用 1 个变量输入来执行此操作,以及如何使用 2 个变量输入来执行此操作并引用第二个变量以进行旋转?我尝试将其作为引用第一个变量的一种方式,但它不起作用:
# Doesn't work
car_fx <- function(df, ...) {
output <- df %>%
group_by_at(c(...)) %>%
summarize(mean_hp = mean(hp, na.rm = TRUE)) %>%
pivot_wider(., names_from = names(.[[1]]), values_from = mean_hp)
}
【问题讨论】: