#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 = "^([^_] )_(.*)"
т. е. сопоставьте один или несколько символов, которые не являются_
(([^_] )
) для начала (^
) имени столбца, и это будет записано в группе, затем_
и повторение символов