在 R 中重新格式化数据框

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

任何帮助将不胜感激

最佳答案

这是一个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]

关于在 R 中重新格式化数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447592/

相关文章:

python - 如何在 groupby 2 列之后保留 DataFrame 的原始索引?

r - 使用 rscript 时出错

r - R 中用于计算药物利用率的 SAS 等效代码

R scale_manual 使用2个字母作为点形

c# - 索引超出范围。必须是非负数且小于集合的大小

Python 递归列表( pop 与 [ ] )

r - 如何从数据框中的列中减去具有唯一行的值

R 数据表 : subgroup weighted percent of group

Java,从文件中读取对象并将它们添加到数组列表中

python - 编辑一个数据框的行似乎会影响另一个数据框? Pandas python