Используйте pivot_longer для широкой таблицы в R?

#r #dataframe #tidyr

Вопрос:

У меня есть некоторые данные, которые выглядят так

 color   value_morning   quality_morning value_evening   quality_evening value_night quality_night
red     10              good            9               good            10          good
blue    7               bad             8               great           10          great
green   7               bad             8               good            6           bad
 

и я пытаюсь использовать pivot_longer() (или любой другой tidy метод), чтобы преобразовать его в:

 color   value   time
red     10      morning
blue    7       morning
green   7       morning
red     9       evening
blue    8       evening
green   8       evening
red     10      night
blue    10      night
green   6       night
 

Мне не нужны quality_ данные, только value_ данные.

Я попытался создать вектор, который выглядел labels <- c("value_morning", "value_evening", "value_night") и работал df %>% pivot_longer(cols = labels) , но это не сработало. Любая помощь будет признательна!

Ответ №1:

Мы удаляем quality колумбы, а затем выполняем pivot_longer

 library(dplyr)
library(tidyr)
df1 %>% 
   select(-starts_with('quality')) %>% 
   pivot_longer(cols = -color, names_to = c(".value", "time"), 
          names_pattern = "(.*)_(.*)")
 

-выход

 # A tibble: 9 × 3
  color time    value
  <chr> <chr>   <int>
1 red   morning    10
2 red   evening     9
3 red   night      10
4 blue  morning     7
5 blue  evening     8
6 blue  night      10
7 green morning     7
8 green evening     8
9 green night       6
 

данные

 df1 <- structure(list(color = c("red", "blue", "green"), value_morning = c(10L, 
7L, 7L), quality_morning = c("good", "bad", "bad"), value_evening = c(9L, 
8L, 8L), quality_evening = c("good", "great", "good"), value_night = c(10L, 
10L, 6L), quality_night = c("good", "great", "bad")),
 class = "data.frame", row.names = c(NA, 
-3L))
 

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

1. какие-нибудь советы по обработке, когда в именах моих исходных столбцов есть несколько подчеркиваний, например value_early_morning ? Я попытался отредактировать предоставленное вами регулярное выражение, но все время получал ошибку «регулярное выражение должно определять 2 группы».

2. @grapestory в этом случае, names_pattern = "^([^_] )_(.*)" т. е. сопоставьте один или несколько символов, которые не являются _ ( ([^_] ) ) для начала ( ^ ) имени столбца, и это будет записано в группе, затем _ и повторение символов