Я думаю, reshape
приблизит вас.
dt_long <- reshape(dt, varying = list(c('CAT1','CAT2'),
c('VAL1','VAL2')),
sep = "",
direction = "long")
dt_long
# time CAT1 VAL1 id
#1.1 1 A1 BLUE 1
#2.1 1 B1 RED 2
#3.1 1 C1 GREEN 3
#1.2 2 A2 BLUE 1
#2.2 2 B2 BLACK 2
#3.2 2 C2 RED 3
Теперь вам нужно исключить ненужные столбцы, как в dt_long[, c("CAT1", "VAL1")]
.
Также, если у вас есть имена столбцов а-ля "CAT1, CAT2, ... CATn", вместо ввода n имен выполните обновление paste0("CAT", 1:n)
.
На основе нового требования мы можем создать столбец VAL
как
dt_long$VAL <- c(rbind(unique(dt_long$VAL1), NA))
# CAT1 VAL1 VAL
#1.1 A1 BLUE BLUE
#1.2 A2 BLUE <NA>
#2.1 B1 RED RED
#2.2 B2 RED <NA>
#3.1 C1 GREEN GREEN
#3.2 C2 GREEN <NA>
Кроме того, для генерации вектора c("VAL11, VAL12, VAL21, VAL22, VAL31, VAL32")
мы можем сделать
paste0("VAL", c(sapply(1:3, paste0, 1:2)))
#[1] "VAL11" "VAL12" "VAL21" "VAL22" "VAL31" "VAL32"
Надеюсь, это поможет.