2017-08-03 60 views
1
dfin <- 

ID SEQ GRP C1 C2 C3 T1 T2 T3 
1  1  1 0  5 8 0  1 2 
1  2  1 5  10 15 5  6 7 
2  1  2 20 25 30 0  1 2 

C1是在T1(TIME)的濃度(CONC)等。這是我想作爲輸出:Restructuing和格式化數據幀列

dfout <- 

ID SEQ GRP CONC TIME 
1  1  1 0  0 
1  1  1 5  1 
1  1  1 8  2 
1  2  1 5  5 
1  2  1 10 6 
1  2  1 15 7 
2  1  2 20 0 
2  1  2 25 1 
2  1  2 30 2 

dfinCxTx其中x是濃度讀數的數量更加列。

回答

3

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

謝謝。我將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

+0

您需要檢查數據框中所有列的數據類型,包括'sapply( df,class)'。並確保它們符合你的預期。這個警告​​意味着某些列不是數字類型,如果強制爲數字類型,你可能會得到意外的NAs – Psidom

+0

謝謝。問題是,我在數據框中有另一個名爲'TRT'的列(從T開始),它是一個整型數據,「TRT」列是數據fra中的'id.vars'之一我。有沒有辦法避免重命名此列? – daragh