Я знаю, что data.table может приводить в порядок несколько столбцов одновременно, в отличие от dplyr, который использует несколько шагов gather
и spread
, которые трудно визуализировать.
Вот запутанная проблема дляthe tidyverse:
library(tidyverse)
df <- data_frame(month_1 = c("Jan", "Feb", "Mar", "Jun"),
score_1 = c(4, 5, 6, 4),
month_2 = c("Jan", "Mar", NA, NA),
score_2 = c(3, 2, NA, NA),
month_3 = c("Feb", "Mar", "Jun", NA),
score_3 = c(8, 7, 4, NA))
# A tibble: 4 x 6
month_1 score_1 month_2 score_2 month_3 score_3
<chr> <dbl> <chr> <dbl> <chr> <dbl>
1 Jan 4 Jan 3 Feb 8
2 Feb 5 Mar 2 Mar 7
3 Mar 6 NA NA Jun 4
4 Jun 4 NA NA NA NA
Мой желаемый результат будет следующим:
id month score
1 Jan 4
1 Feb 5
1 Mar 6
1 Jun 4
2 Jan 3
2 Mar 2
3 Feb 8
3 Mar 7
3 Jun 4
data.table пользователи могут решить эту проблему путем плавления с помощью шаблонов, например:
melt(setDT(df), measure = patterns("^month", "^score"))
Но поскольку нет эквивалентной функции dplyr, я понимаю, что потребуется несколько spread
.Похоже, что мое решение ниже должно работать, но второе spread
не работает:
df %>%
gather(key, value) %>%
mutate(id = parse_number(key),
key = str_replace(key, "_[0-9]", "")) %>%
spread(key, value )
Прежде чем пометить это как дубликат, пожалуйста, попробуйте.Подобные вопросы имеют уникальный идентификатор в существующей колонке.Этот пример имеет идентификаторы в заголовках.