我有一个39列(向上有100000行)数据框,其最后十列看起来像那样(其余列不关心我的问题)
H3K27me3_gross_bin H3K4me3_gross_bin H3K4me1_gross_bin UtoP UtoM UPU UPP UPM UMU UMP UMM
cg00000029 3 3 6 1 1 0 0 0 0 0 0
cg00000321 6 1 5 1 0 0 1 0 0 0 0
cg00000363 6 1 1 1 0 1 0 0 0 0 0
cg00000622 1 2 1 0 0 0 0 0 0 0 0
cg00000714 2 5 6 1 0 0 0 0 0 0 0
cg00000734 2 6 2 0 0 0 0 0 0 0 0
我想创建一个矩阵:
a)通过前三列中的每一列计算值列UPU,UPP或UPM为1的行数(H3K27me3_gross_bin,H3K4me3_gross_bin,H3K4me1_gross_bin) b)将前两列的UPU,UPP,UPM列的每行加起来
我想出了这种令人难以置信的繁琐方式:
UtoPFrac<-seq(6)
UtoPTotEvents<-seq(6)
for (j in 1:3){
y<-df[,28+j]
for (i in 1:3){
UtoPFrac<-cbind(UtoPFrac,tapply(df[which(is.na(y)==FALSE),33+i],y[which(is.na(y)==FALSE)], function(x) length(which(x==1))))
}
}
UtoPFrac<-UtoPFrac[,2:10]
UtoPEvents<-cbind(rowSums(UtoPFrac[,1:3]),rowSums(UtoPFrac[,4:6]),rowSums(UtoPFrac[,7:9]))
我是certian有一种更加优雅的方式来做这件事,可能是通过使用aggregate()或ddply(),但无法使其正常工作。 我会更有效地帮助你做任何帮助
提前致谢
答案 0 :(得分:0)
未经测试:
library(plyr)
dpply(df,.(H3K27me3_gross_bin, H3K4me3_gross_bin, H3K4me1_gross_bin), summarize, UPUl=length(UPU[which(UPU==1)]),UPPl=length(UPP[which(UPP==1)]),UPMl=length(UPM[which(UPM==1)]), mysum=sum( UPU + UPP + UPM))
P.S。如果你dput
数据并提供预期的输出,我将测试上面的代码