2017-08-03 80 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