Вот решение tidyverse
:
# make sample data
set.seed(1839)
dat <- data.frame(
id = 1:3,
avgbed_2017 = rnorm(3), # note: rename this column
staff_2014 = rnorm(3),
staff_2015 = rnorm(3),
outpatient_2013 = rnorm(3)
)
# gather and separate
library(dplyr)
library(tidyr)
dat %>%
gather("key", "value", -id) %>% # gathers everything but id
# if you wanna get rid of NA values, say na.rm = TRUE in gather
separate("key", c("category", "year"), sep = "_")
Обратите внимание, что вы должны переименовать avg_bed_2017
в avgbed_2017
, чтобы это работало.Если бы я лучше разбирался в регулярных выражениях, я бы сделал sep
в separate
регулярным выражением, которое соответствует только второму вхождению подчеркивания - возможно, кто-то другой может показать мне, как это сделать.Чтобы обойти это, я просто переименовал столбец выше, так что единственное подчеркивание - это то, на которое мы хотим разбить.
Per @ Dave2e:
set.seed(1839)
data.frame(
id = 1:3,
avg_bed_2017 = rnorm(3),
staff_2014 = rnorm(3),
staff_2015 = rnorm(3),
outpatient_2013 = rnorm(3)
) %>%
gather("key", "value", -id) %>%
separate("key", c("category", "year"), sep = "_(?=[0-9]{4})")