简体   繁体   中英

In R How Do I Name a Dataframe Column After a Variable?

As a part of a function I'm trying to create a dataframe and I want to name one of the columns after a variable. The below is some dummy data and is the part that I'm stuck on.

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") 

In the summarise function call I want the column name metric to be called sessions, I've tried using get(metric) and (.!metric) as part of the naming of the column but it doesn't work.

Is this even possible to do in R? Any help would be appreciated.

Do you mean something like this?

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

If you wish to use a variable as a name on the left hand side of a dplyr function, (without having to separately rename the column), you can use :!variable := instead of variable = , so in your case it would be:

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

We can also do this with

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM