在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
嗯,它的工作原理......然而,众所周知,循环不是很强大:我需要操纵大数据帧(大约数十万行),这段代码使我的计算机崩溃。
有没有人知道如何获得相同的结果但避免循环?
非常感谢任何帮助......
答案 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