【问题标题】:Passing variables into the names_glue parameter of tidyr::pivot_wider将变量传递给 tidyr::pivot_wider 的 names_glue 参数
【发布时间】:2021-01-14 14:09:14
【问题描述】:

这里有一些愚蠢的数据,我们使用两个名称进行更广泛的透视:

library(tidyr)

df <- data.frame(
    food = c('banana','banana','banana','banana','cheese','cheese','cheese','cheese'),
    binary = c(rep(c('yes','no'), 4)),
    car = c('toyota','subaru','mazda','skoda','toyota','subaru','mazda','skoda'),
    fun = c(2,4,3,6,2,4,2,3))

df %>%
    pivot_wider(
        id_cols = food,
        names_from = c(car, binary),
        values_from = fun)

如果我们想改变新变量名的格式,例如,从toyota_yesyes_toyota,我们使用names_glue 参数:

df %>%
    pivot_wider(
        id_cols = food,
        names_from = c(car, binary),
        names_glue = "{binary}_{car}",
        values_from = fun)

我面临的问题是找到将变量名传递给names_glue 参数的正确语法。将变量传递给names_from 很容易,例如:

var1 <- 'car'
var2 <- 'binary'
df %>%
    pivot_wider(
        id_cols = food,
        names_from = c(var1, var2),
        values_from = fun)

但我们不能直接使用names_glue

df %>%
    pivot_wider(
        id_cols = food,
        names_from = c(var1, var2),
        names_glue = "{var1}_{var2}",
        values_from = fun)

错误:列名 car_binarycar_binarycar_binary 不得重复。

大概它正在评估变量并将结果字符串(即'car'或'binary')传递给glue函数。我玩过一些我通常用于整洁评估的东西(!!sym(...) 等),但没有任何工作。所需的输出如下,使用 names_glue 参数的变量:

# A tibble: 2 x 5
  food   yes_toyota no_subaru yes_mazda no_skoda
  <fct>       <dbl>     <dbl>     <dbl>    <dbl>
1 banana          2         4         3        6
2 cheese          2         4         2        3

Here is the commit that added the names_glue parameter to pivot_wider -- although I can't really figure out how to troubleshoot with this.

【问题讨论】:

    标签: r tidyr tidyeval r-glue


    【解决方案1】:

    你可以使用sprtinf/paste0来构造字符串:

    library(tidyr)
    df %>%
      pivot_wider(
        id_cols = food,
        names_from = c(var1, var2),
        names_glue = sprintf('{%s}_{%s}', var2, var1),
        values_from = fun)
    
    #  food   yes_toyota no_subaru yes_mazda no_skoda
    #  <chr>       <dbl>     <dbl>     <dbl>    <dbl>
    #1 banana          2         4         3        6
    #2 cheese          2         4         2        3
    

    【讨论】:

      【解决方案2】:

      我们可以用glue创建模式

      library(dplyr)
      library(tidyr)
      df %>%
           pivot_wider(
               id_cols = food,
               names_from = c(var1, var2),
               names_glue = glue::glue("{[var1]}_{[var2]}", .open = '[', .close = ']'),
               values_from = fun)
      # A tibble: 2 x 5
      #  food   toyota_yes subaru_no mazda_yes skoda_no
      #  <chr>       <dbl>     <dbl>     <dbl>    <dbl>
      #1 banana          2         4         3        6
      #2 cheese          2         4         2        3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-05
        • 2021-07-28
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 1970-01-01
        相关资源
        最近更新 更多