【问题标题】:How to use pivot_wider while passing unkown number of variables to a function in dplyr如何在将未知数量的变量传递给dplyr中的函数时使用pivot_wider
【发布时间】: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)
}

【问题讨论】:

    标签: r dplyr pivot tidyverse


    【解决方案1】:

    我认为这应该可行

    car_fx <- function(df, ...) {
      output <- df %>% 
        group_by_at(c(...)) %>% 
        summarize(mean_hp = mean(hp, na.rm = TRUE)) %>% 
        pivot_wider(., names_from = c(...)[1], values_from = mean_hp)
        output
    }
    

    您可以根据自己的喜好更改 [1],如果您需要围绕 3 组的特定行为,欢迎来到 if else hell,祝您好运

    【讨论】:

    • 正是我需要的。谢谢。
    • 没问题,也请考虑投票
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2018-11-09
    • 2011-05-06
    • 1970-01-01
    • 2016-12-13
    • 2020-12-20
    相关资源
    最近更新 更多