重新格式化R中的数据帧

时间:2017-08-01 20:57:22

标签: r list dataframe reshape

我的数据框格式如下:

Species  Annotation  Gene          Group  Mean_expression
ARIRE    TAR2_ARATH  Tr_200_G1_i1  1      8.408
CYLIM    TAR2_ARATH  Tr_11_G1_i1   1      10.39
ECHPL    TAR2_ARATH  Tr_222_G1_i1  1      9.32
FERPI    TAR2_ARATH  Tr_600_G1_i3  1      11.21
ARIRE    BRL2_ORYSH  Tr_80_G1_i9   2      180.33
CYLIM    BRL2_ORYSH  Tr_320_G1_i1  2      200.227
CYLIM    BRL2_ORYSH  Tr_320_G1_i2  2      150.343
ECHPL    BRL2_ARATH  TR_111_G1_i5  2      100.209    

我希望有一个数据框,其中物种是列的变量。

           ARIRE   CYLIM   ECHPL   FERPL 
  Group1   8.4     10.39   9.32    11.21 
  Group2   180.33  200.227 100.209 NA
  Group2   NA      150.343 NA      NA

你知道最好的方法是什么吗?我已经将数据框转换为列表并尝试了splitreshape,但没有取得好成绩。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:3)

这是一个data.table解决方案:

library(data.table)

dtt[, g := seq_len(.N), by = .(Species, Annotation)]
res <- dcast(dtt, Group + g ~ Species, value.var = 'Mean_expression')
res[, g := NULL]
res
# > res
#    Group   ARIRE   CYLIM   ECHPL FERPI
# 1:     1   8.408  10.390   9.320 11.21
# 2:     2 180.330 200.227 100.209    NA
# 3:     2      NA 150.343      NA    NA

数据:

dtt <- read.table(textConnection('Species  Annotation  Gene          Group  Mean_expression
ARIRE    TAR2_ARATH  Tr_200_G1_i1  1      8.408
CYLIM    TAR2_ARATH  Tr_11_G1_i1   1      10.39
ECHPL    TAR2_ARATH  Tr_222_G1_i1  1      9.32
FERPI    TAR2_ARATH  Tr_600_G1_i3  1      11.21
ARIRE    BRL2_ORYSH  Tr_80_G1_i9   2      180.33
CYLIM    BRL2_ORYSH  Tr_320_G1_i1  2      200.227
CYLIM    BRL2_ORYSH  Tr_320_G1_i2  2      150.343
ECHPL    BRL2_ARATH  TR_111_G1_i5  2      100.209'), header = TRUE)

setDT(dtt)

修改

来自rowid的{​​{1}},上述解决方案可以进一步简化:

data.table