将data.frame转换为表达式数据的矩阵

时间:2013-02-13 22:14:46

标签: r matrix dataframe

我是R的新手,但我变得危险了。我想从药物治疗后监测的大约2000个基因制作一个大规模的基因表达谱图。通过csv加载后的数据帧如下所示:

head(tmp)
  gene_symbol   untreated   X1hr.avg   X3hr.avg    X6hr.avg  X24hr.avg
1      ERRFI1  0.16612478 -2.0758630 -2.5892085 -2.02039809 -2.4124696
2      ERRFI1  0.27750147 -2.3086333 -3.0538376 -4.01436186 -4.7491462
3     CTDSPL2  0.13172411 -0.7920983 -0.3580963 -0.76213664 -0.8171385
4     CTDSPL2 -0.05205203 -0.9551288 -0.2072265 -0.76993891 -1.0028680
5     SLC26A2  0.20268100  0.5188266  0.5429924  0.01970562 -1.1955852
6     SLC29A4  0.19658238 -0.8102461 -0.9019243 -1.50714838 -1.4648872

我想将此数据框转换为以下内容:

gene_symbol  ratio       treatment
ERRFI1       0.16612478  untreated
ERRFI1       -2.0758630  X1hr.avg 
ERRFI1       -2.5892085  X3hr.avg
ERRFI1       -2.02039809 X6hr.avg
ERRFI1       -2.4124696  X24hr.avg

等...

这将允许我通过ggplot绘图:

ggplot(data=tmp, aes(x=factor(treatment), y=ratio, group=gene_symbol)) + geom_line() + geom_point()

2 个答案:

答案 0 :(得分:3)

您正在寻找的是reshape2库中的melt()函数。我使用了你的变量名,但我建议将融化的数据存储到不同的变量名中。

tmp <- as.data.frame(read.table(text="gene_symbol   untreated   X1hr.avg   X3hr.avg    X6hr.avg  X24hr.avg
                            1      ERRFI1  0.16612478 -2.0758630 -2.5892085 -2.02039809 -2.4124696
                            2      ERRFI1  0.27750147 -2.3086333 -3.0538376 -4.01436186 -4.7491462
                            3     CTDSPL2  0.13172411 -0.7920983 -0.3580963 -0.76213664 -0.8171385
                            4     CTDSPL2 -0.05205203 -0.9551288 -0.2072265 -0.76993891 -1.0028680
                            5     SLC26A2  0.20268100  0.5188266  0.5429924  0.01970562 -1.1955852
                            6     SLC29A4  0.19658238 -0.8102461 -0.9019243 -1.50714838 -1.4648872", header=TRUE))

library(reshape2)

tmp <- melt(data=tmp, id.vars=c("gene_symbol"))
names(tmp) <- sub("variable", "treatment", names(tmp))
names(tmp) <- sub("value", "ratio", names(tmp))

ggplot(data=tmp, aes(x=factor(treatment), y=ratio, group=gene_symbol)) + geom_line(aes(colour=gene_symbol)) + geom_point()    

your output

不确定这是否是提供此类数据的有用方法。你可能想重新考虑一下你的目标是什么。

答案 1 :(得分:1)

您真正在做的是“堆叠”您的变量,因此您也可以使用... stack函数。

out <- data.frame(tmp[1], stack(tmp[-1]))

您会收到警告,但这是警告,而不是错误。它只是告诉你输出有新的行名。

以下是生成的“堆叠”data.frame的第一行和最后几行:

> head(out)
  gene_symbol      values       ind
1      ERRFI1  0.16612478 untreated
2      ERRFI1  0.27750147 untreated
3     CTDSPL2  0.13172411 untreated
4     CTDSPL2 -0.05205203 untreated
5     SLC26A2  0.20268100 untreated
6     SLC29A4  0.19658238 untreated
> tail(out)
   gene_symbol     values       ind
25      ERRFI1 -2.4124696 X24hr.avg
26      ERRFI1 -4.7491462 X24hr.avg
27     CTDSPL2 -0.8171385 X24hr.avg
28     CTDSPL2 -1.0028680 X24hr.avg
29     SLC26A2 -1.1955852 X24hr.avg
30     SLC29A4 -1.4648872 X24hr.avg