Вот опция с reshape
.
names(df1)[ncol(df1)] <- "ses1"
df1$ses2 <- df1$ses1 # according to your desired output
out <- reshape(df1, varying = 2:7, direction = "long", sep = "")
out[order(out$id), ]
# id time mathT write ses
#1.1 1 1 10 2 3
#1.2 1 2 11 3 3
#2.1 2 1 9 3 4
#2.2 2 2 6 5 4
#3.1 3 1 7 1 5
#3.2 3 2 8 1 5
Не то, чтобы нам нужно было создать столбец ses2
, чтобы получить желаемый результат.Если вы хотите вместо NA
s указать значения ses2
- что я считаю правильным, учитывая вводимые вами данные - взгляните на решение data.table
ниже.
Использование melt
из data.table
library(data.table)
setDT(df1)
melt(df1,
id.vars = "id",
measure.vars = patterns("^mathT", "^write", "^ses"),
variable.name = "Time",
value.name = c("mathT", "write", "ses"))
# id Time mathT write ses
#1: 1 1 10 2 3
#2: 2 1 9 3 4
#3: 3 1 7 1 5
#4: 1 2 11 3 NA
#5: 2 2 6 5 NA
#6: 3 2 8 1 NA
data Благодаря @Pete!
df1 <- data.frame(
id = c(1, 2, 3),
mathT1 = c(10, 9, 7),
mathT2 = c(11, 6, 8),
write1 = c(2, 3, 1),
write2 = c(3, 5, 1),
ses = c(3, 4, 5)
)