Мы можем использовать melt
из data.table
, который может принимать несколько столбцов для преобразования из 'wide' в 'long' в аргументе measure
library(data.table)
melt(setDT(temp), measure = patterns("^x\\d+", "^y\\d+"),
value.name = c('mean', 'se'), variable.name = 'part')[,
part := paste0("X", part)][order(region)]
# region part mean se
#1: A X1 1 0.1
#2: A X2 2 0.2
#3: B X1 3 0.3
#4: B X2 4 0.2
Или мы можем использовать tidyverse
, так как это полезно для трубопровода с ggplot
library(ggplot2)
gather(temp, key, val, x1:y2) %>%
separate(key, into = c('key1', 'part'), sep="(?<=[a-z])(?=[0-9])") %>%
spread(key1, val) %>%
rename_at(3:4, ~ c('mean', 'se')) %>%
mutate(part = paste0("X", part))
# region part mean se
#1 A X1 1 0.1
#2 A X2 2 0.2
#3 B X1 3 0.3
#4 B X2 4 0.2