2013-09-10 2 views
1

У меня есть 39 колонки (с вверх 100000 строк) кадра данных, чьи последние десять столбцов выглядит следующим образом (остальные столбцы не касаются моего вопроса)г сумма несколько colmns по другой колонке

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 

Я хочу, чтобы создать матрицу, которая будет:

а) подсчитать количество строк, в которых значение колонки ВПС, УПП или UPM равна 1 по каждой из первых трех столбцов (H3K27me3_gross_bin, H3K4me3_gross_bin, H3K4me1_gross_bin) б) сумма каждый ряд столбцов ВПС, УПП, УПМ по первым трем столбцам

я придумал эту невероятно громоздкий способ сделать это:

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 есть более Elegent способ сделать это, вероятно, с помощью агрегата() или ddply(), но не смог получить это работает. я apprciate помощь делает это более efficenly

Спасибо заранее

+0

Было бы лучше, если бы вы использовали 'dput' и' head' для размещения вашего data.frame. Похоже, что у вас есть 12 столбцов и 11 имен столбцов. – harkmug

+0

К сожалению, неясно, чего вы хотите достичь. Не могли бы вы обновить свой вопрос с требуемым выходом. – Henrik

ответ

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 данные и получите ожидаемый результат, я проверю вышеуказанный код.

Смежные вопросы