2017-08-01 7 views
0

マトリックスに条件を適用integermatrixは、効率的に私が

set.seed(1) 
counts.mat <- matrix(sample(50,29*10,replace=T),nrow=10,ncol=29) 
colnames(counts.mat) <- c("ww.1m_1","ww.1m_2","wm.1m_1","wm.1m_2","wm.1m_3","wn.1m_1","wn.1m_2", 
"A_1","A_2","B_1","B_2","C_1","C_2", 
"ww.2m_1","ww.2m_2","ww.2m_3","wm.2m_1","wm.2m_2","wn.2m_1","wn.2m_2", 
"ww.3m_1","ww.3m_2","ww.3m_3","wm.3m_1","wm.3m_2","wm.3m_3","wn.3m_1","wn.3m_2","wn.3m_3") 

その要素がこのlistdata.frameのに記載されている(本実施例3に)実験の組から取られた特定の測定値の数を表しますさん:

df.list <- list(df1 = data.frame(gt1=c("ww.1m","wm.1m","wn.1m"),kt1=c("A","B","C"),stringsAsFactors=F), 
       df2 = data.frame(gt2=c("ww.2m","wm.2m","wn.2m"),stringsAsFactors=F), 
       df3 = data.frame(gt2=c("ww.3m","wm.3m","wn.3m"),stringsAsFactors=F)) 

その対応する実験の要素であるすべてのdata.framedf.list内の列と、その列の値は、事実上ですrレベル。 colnamescounts.matは、これらの因子レベルの複製であり、その名前は次の形式に従います。

<factor.level>_<replicate>

これはdf.listに対応しています。

そのそれぞれの反復 counts.mat

"ww.1m" "wm.1m" "wn.1m"

である:考える

"ww.1m_1","ww.1m_2","wm.1m_1","wm.1m_2","wm.1m_3","wn.1m_1","wn.1m_2"

、例えば

gt1はレベルの係数であります10

min.counts <- 10

少なくともmin.replicates以上counts.matの各行について少なくともmin.counts以上を持っている場合、私は何をしたいdf.listリターンTRUEまたはFALSEに各data.frameに、各因子(列)のためです。

結果は、列のその数はdf.listの因子レベルの合計数に等しく、行の数がcounts.matの行の数に等しいmatrixなければなりません。

res.mat <- do.call(rbind,lapply(1:nrow(counts.mat),function(i){ 
    return(do.call(cbind,lapply(1:length(df.list),function(l){ 
    return(do.call(cbind,lapply(1:ncol(df.list[[l]]),function(j){ 
     return(do.call(cbind,lapply(1:nrow(df.list[[l]]),function(k){ 
     return(length(which(counts.mat[i,which(grepl(paste0(df.list[[l]][k,j],"_\\d+$"),colnames(counts.mat),perl=T))] >= min.counts)) >= min.replicates) 
     }))) 
     }))) 
    }))) 
})) 

だから私はかなり速い何かを探しています:ここで

は私が遅いの実装と思われるものです。

+0

与えます - 最後から二番目のライン上のものではなく、' 2m'でなければなりませんが「3m」よりも? –

+0

申し訳ありません - 固定 – dan

答えて

1

私は、それが10の場合(すべての要素がTRUEある30に上記の私のコメントに補正し、min.replicatesセットで

dfcols <- unlist(df.list) #extract list of columns required as a vector 
matcols <- lapply(dfcols,function(x) which(startsWith(colnames(counts.mat),x))) #match to matrix columns 
resmat <- sapply(1:length(dfcols),function(i) 
     apply(counts.mat[,matcols[[i]]],1,function(y) sum(y>=min.count) >= min.replicates)) 
colnames(resmat) <- dfcols #set colnames in output 

...これは同じことを行い思うし、より高速でなければなりませんあなたの例)、これは...あなたの `counts.mat`あなたが重複する列名` wm.3m_1`と `wm.3m_2`を持っていることで

resmat 
     ww.1m wm.1m wn.1m  A  B  C ww.2m wm.2m wn.2m ww.3m wm.3m wn.3m 
[1,] FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE 
[2,] FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE FALSE TRUE FALSE 
[3,] TRUE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE 
[4,] TRUE FALSE FALSE FALSE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE 
[5,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE 
[6,] TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE FALSE 
[7,] TRUE TRUE FALSE TRUE FALSE TRUE FALSE TRUE TRUE TRUE TRUE FALSE 
[8,] TRUE FALSE TRUE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE TRUE 
[9,] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE 
[10,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE