你可以用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