【问题标题】:In R How Do I Name a Dataframe Column After a Variable?在 R 中,如何在变量后命名数据框列?
【发布时间】:2020-06-28 17:59:10
【问题描述】:

作为函数的一部分,我正在尝试创建一个数据框,并且我想在变量之后命名其中的一列。下面是一些虚拟数据,是我坚持的部分。

library(tidyverse)
graph <-  data.frame(brand = rep(c("A","B","C"), each = 3),
                    week_commencing = rep(as.Date(c('2020-03-01', '2020-04-01', '2020-05-01')), times = 3),
            sessions = sample(1000:2000,9),
            conv_rate = runif(9,0,1))

website = "A"
metric = "sessions"

graph %>% 
  filter(brand == (!!website)) %>%
  group_by(brand) %>% 
  summarise(metric = max(get(metric)),
            week_commencing = min(week_commencing),
            lab = "This Year") 

在汇总函数调用中,我希望将列名度量称为会话,我尝试使用 get(metric) 和 (!!metric) 作为列命名的一部分,但它不起作用。

这甚至可以在 R 中实现吗?任何帮助将不胜感激。

【问题讨论】:

  • 即使在函数内部,我认为过滤器也不需要 tidyeval。你可以这样做:filter(brand == website)
  • 这个问题的答案显示了如何在可以使用变量stackoverflow.com/q/6081439/59470的基础 R 中更改数据框中的列名

标签: r function dplyr


【解决方案1】:

如果您希望在 dplyr 函数的左侧使用变量作为名称(无需单独重命名列),您可以使用 !!variable := 而不是 variable =,因此在您的情况是:

graph %>% 
  filter(brand == (!!website)) %>%
  group_by(brand) %>% 
  summarise(!!metric := max(get(metric)),
            week_commencing = min(week_commencing),
            lab = "This Year") 
#> # A tibble: 1 x 4
#>   brand sessions week_commencing lab      
#>  <chr>    <int> <date>          <chr>    
#> 1 A         1901 2020-03-01      This Year

【讨论】:

  • 效果很好,这正是我所追求的!非常感谢
【解决方案2】:

你的意思是这样的吗?

library(tidyverse)
graph <-  data.frame(brand = rep(c("A","B","C"), each = 3),
                     week_commencing = rep(as.Date(c('2020-03-01', '2020-04-01', '2020-05-01')), times = 3),
                     sessions = sample(1000:2000,9),
                     conv_rate = runif(9,0,1))

website = "A"

metric = "sessions"

graph %>% 
  filter(brand == (!!website)) %>%
  group_by(brand) %>% 
  summarise(metric = max(get(metric)),
            week_commencing = min(week_commencing),
            lab = "This Year") %>% rename(sessions=metric)

# A tibble: 1 x 4
  brand sessions week_commencing lab      
  <fct>    <int> <date>          <chr>    
1 A         1819 2020-03-01      This Year

【讨论】:

    【解决方案3】:

    我们也可以这样做

    library(dplyr)   
    graph %>%
       filter(brand == website) %>%
       group_by(brand) %>% 
       summarise(metric = max(!! rlang::sym(metric)),
                 week_commencing = min(week_commencing),
                 lab = "This Year") %>% rename_at(vars(metric), ~ 'sessions')
    # A tibble: 1 x 4
      brand sessions week_commencing lab      
      <chr>    <int> <date>          <chr>    
    1 A         1555 2020-03-01      This Year
    

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 2015-09-28
      • 2018-11-09
      • 2012-05-26
      • 1970-01-01
      • 2012-04-28
      • 2013-07-11
      • 2021-11-03
      • 1970-01-01
      相关资源
      最近更新 更多