переименовать с помощью предиката, но на основе значения в другой переменной

#r #dplyr #tidyverse

#r #dplyr #tidyverse

Вопрос:

Есть ли способ переименовать_собой, но вместо функции предиката быть в имени столбца, функция предиката будет основана на значении в другой переменной?

Допустим, у меня есть набор данных следующим образом:

 data <- tibble(home_team = c("SF", "KC", "JAX", "WAS", "BUF"),
               away_team = c("GB", "CAR", "HOU", "NYG", "SEA"),
               home_total = c(21, 25, 30, 22, 23.5),
               home_plays = c(65, 64, 63, 57, 60),
               away_total = c(30, 22, 25, 22, 25),
               away_plays = c(56, 62, 66, 59, 62))
  

И я пытаюсь заставить его выглядеть примерно так:

 finalized_data <- tibble(team = c("SF", "KC", "JAX", "WAS", "BUF", "GB", "CAR", "HOU", "NYG", "SEA"),
                         total = c(21, 25, 30, 22, 23.5, 30, 22, 25, 22, 25),
                         plays = c(65, 64, 63, 57, 60, 56, 62, 66, 59, 62)) 
  

В настоящее время лучший способ, который я знаю, — это использовать функцию mutate, которая становится длинной, когда есть много переменных, и должен быть более чистый способ сделать это, поскольку это, по сути, переименование, которое я делаю на основе переменной в данных.

 current_way <- data %>% 
  pivot_longer(c(home_team, away_team), names_to = "team_type", values_to = "team") %>%
  mutate(total = ifelse(str_detect(team_type, "home_team"), home_total, away_total),
         plays = ifelse(str_detect(team_type, "home_team"), home_plays, away_plays)) %>%
  select(team, total, plays)
  

Есть какие-нибудь мысли или есть ли вообще способ сделать это в функции pivot, который мне не хватает?

Ответ №1:

Вот вариант с pivot_longer использованием шаблона имен столбцов для разделения на столбцы

 library(dplyr)
library(tidyr)
data %>% 
  pivot_longer(cols = everything(), names_to = c("grp", ".value"), 
           names_sep = "_") %>%
   arrange(desc(grp)) %>%
   select(-grp)    
  

-вывод

 # A tibble: 10 x 3
#   team  total plays
#   <chr> <dbl> <dbl>
# 1 SF     21      65
# 2 KC     25      64
# 3 JAX    30      63
# 4 WAS    22      57
# 5 BUF    23.5    60
# 6 GB     30      56
# 7 CAR    22      62
# 8 HOU    25      66
# 9 NYG    22      59
#10 SEA    25      62
  

Комментарии:

1. Спасибо, это идеально! Что бы я использовал для аргумента name_sep, если бы у меня было имя столбца типа «home_run_plays», поскольку идентификатор должен разделяться первым подчеркиванием?

2. @NateN В этом случае я бы предположил, что «run_plays» будет использоваться в качестве имени столбца вместо «plays», верно? затем names_sep="(?<=home)_" или с помощью names_pattern = "^(home)_(.*)"