我有一个 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) 通过前三列 (H3K27me3_gross_bin, H3K4me3_gross_bin, H3K4me1_gross_bin) 计算值列 UPU、UPP 或 UPM 为 1 的行数 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]))
我确信有一种更优雅的方法可以做到这一点,可能是使用聚合()或 ddply(),但无法使其正常工作。我会更有效地感谢任何帮助
提前致谢