在 R 中重新格式化数据框

Reformat a data frame in R

我有一个格式如下的数据框:

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 但没有很好的结果。

任何帮助将不胜感激

这里有一个 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)

编辑

使用 data.table 中的 rowid,可以进一步简化上述解决方案:

dcast(
    dtt,
    Group + rowid(Species, Annotation) ~ Species,
    value.var = 'Mean_expression')[, Species := NULL]