在 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
您知道执行此操作的最佳方法是什么吗?我已经将数据框转换为列表并尝试了 split
和 reshape
但没有很好的结果。
任何帮助将不胜感激
这里有一个 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]
我有一个格式如下的数据框:
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
您知道执行此操作的最佳方法是什么吗?我已经将数据框转换为列表并尝试了 split
和 reshape
但没有很好的结果。
任何帮助将不胜感激
这里有一个 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]