你可以用data.table::melt
做到这一点,其熔化表到基于列的图案多列的能力:
library(data.table)
melt(
setDT(df),
id.vars=c("ID", "SEQ", "GRP"),
# columns starts with C and T should be melted into two separate columns
measure.vars=patterns("^C", "^T"),
value.name=c('CONC', 'TIME')
)[order(ID, SEQ)][, variable := NULL][]
# ID SEQ GRP CONC TIME
#1: 1 1 1 0 0
#2: 1 1 1 5 1
#3: 1 1 1 8 2
#4: 1 2 1 5 5
#5: 1 2 1 10 6
#6: 1 2 1 15 7
#7: 2 1 2 20 0
#8: 2 1 2 25 1
#9: 2 1 2 30 2
,或者该值的列名遵循的模式[CT][0-9]
,你可以使用reshape
从基地R通过指定sep=""
哪些将由字母/数字分隔由于此默认设置(从?reshape)分割值列的名称:
split = if (sep == "") {
list(regexp = "[A-Za-z][0-9]", include = TRUE)
} else {
list(regexp = sep, include = FALSE, fixed = TRUE)}
reshape(df, varying=-(1:3), idvar=c("ID", "SEQ", "GRP"),
dir="long", sep="", v.names=c("CONC", "TIME"))
# ID SEQ GRP time CONC TIME
#1: 1 1 1 1 0 5
#2: 1 2 1 1 5 10
#3: 2 1 2 1 20 25
#4: 1 1 1 2 8 0
#5: 1 2 1 2 15 5
#6: 2 1 2 2 30 0
#7: 1 1 1 3 1 2
#8: 1 2 1 3 6 7
#9: 2 1 2 3 1 2
谢谢。我将data.table方法应用到了我的整个数据框中,但得到了这个警告:Warning message:In melt.data.table(setDT(data1),id.vars = c(“SUB”,“SEQ”,“PER”,: 'measure.vars'[TRT,T1,T2,T3,...]不是全部相同的类型。按照层次顺序,熔化数据值列将是'double'类型。 'double'将会被强制转换到'melt.data.table'中查看详细信息以获取更多的强制信息。'这是一个严重警告吗? – daragh
您需要检查数据框中所有列的数据类型,包括'sapply( df,class)'。并确保它们符合你的预期。这个警告意味着某些列不是数字类型,如果强制为数字类型,你可能会得到意外的NAs – Psidom
谢谢。问题是,我在数据框中有另一个名为'TRT'的列(从T开始),它是一个整型数据,“TRT”列是数据fra中的'id.vars'之一我。有没有办法避免重命名此列? – daragh