Без дополнительных пакетов вы можете сделать:
setNames(
cbind(
stack(Girls[, grep("\\d{4}", names(Girls))]),
stack(Girls[, grep("^X", names(Girls))])[, 1, drop = F]
),
c("Name", "Year", "Score")
)
Вывод:
Name Year Score
1 a 1954 5
2 b 1954 6
3 c 1954 1
4 d 1954 2
5 e 1955 2
6 f 1955 4
7 g 1955 6
8 h 1955 9
9 j 1956 1
10 k 1956 3
11 l 1956 6
12 m 1956 8
Обратите внимание, что это потребовало некоторых изменений в коде, который вы использовали для создания примера, какВы не можете напрямую указывать числа в качестве имен столбцов (они должны быть внутри ``, а также буквы должны заключаться в кавычки).
Правильный код будет:
`1954` <- c("a","b","c","d")
X2 <- c(5,6,1,2)
`1955` <- c("e","f","g","h")
X3 <- c(2,4,6,9)
`1956` <- c("j","k","l","m")
X4 <- c(1,3,6,8)
Girls <- data.frame(`1954`,X2,`1955`,X3,`1956`,X4,
stringsAsFactors = FALSE, check.names = FALSE)