重新排列数据框 - 从列的级别到列的名称(避免循环)

时间:2015-07-25 07:42:00

标签: r

在R中,我编写了以下代码来重新排列数据帧,以便列的级别成为新数据帧的列 - 通过示例肯定更清晰:

gene <- c("gene1","gene1", "gene2","gene2", "gene3", "gene3")
stage <- c("stage1", "stage2","stage1", "stage2","stage1", "stage2")
intensity <- c("0.1","0.1","0.2","0.4","0.3","0.6")
df1 <- data.frame(gene, stage, intensity)

   gene  stage    intensity
   gene1 stage1   0.1
   gene1 stage2   0.1
   gene2 stage1   0.2
   gene2 stage2   0.4
   gene3 stage1   0.3
   gene3 stage2   0.6

df2<-(unique(df1[,"gene",drop=FALSE]))
df1$stage<-as.factor(df1$stage)
tempStages<-levels(df1$stage)
for(i in tempStages){
    temp<-df1[df1$stage==i,!colnames(df1)=="stage"]
    colnames(temp)[2]<-i
    df2<-merge(df2,temp,by=c("gene"),all.x=TRUE)
 }

    gene    stage1   stage2
    gene1    0.1     0.1
    gene2    0.2     0.4
    gene3    0.3     0.6

嗯,它的工作原理......然而,众所周知,循环不是很强大:我需要操纵大数据帧(大约数十万行),这段代码使我的计算机崩溃。

有没有人知道如何获得相同的结果但避免循环?

非常感谢任何帮助......

1 个答案:

答案 0 :(得分:1)

看起来您想要从长格式转换为宽格式。一个选项是来自dcast的{​​{1}}。如果我们转换了&#39; data.frame&#39;到&#39; data.table&#39;来自reshape2的开发版本的setDT(df1)),dcast也可以使用。

data.table

或使用library(reshape2) dcast(df1, gene~stage, value.var='intensity') # gene stage1 stage2 #1 gene1 0.1 0.1 #2 gene2 0.2 0.4 #3 gene3 0.3 0.6 中的dcast。它应该对大数据集有效。

data.table

或者

library(data.table)#v1.9.5+
dcast(setDT(df1), gene~stage, value.var='intensity')
#    gene stage1 stage2
#1: gene1    0.1    0.1
#2: gene2    0.2    0.4
#3: gene3    0.3    0.6

或使用library(tidyr) spread(df1, stage, intensity)

base R