2016-10-11 36 views
1

"正"(1)または "負(0)"のデータポイントを持つ大きなデータフレームを持っています。ベクトル/行がデータフレームに一致する回数をカウントします。

データ例

my_data <- data.frame(cell = 1:4, marker_a = c(1, 0, 0, 0), 
    marker_b = c(0,1,1,1), marker_c = c(0,1,1,0), marker_d = c(0,1,0,1)) 


    cell marker_a marker_b marker_c marker_d 
1 1  1  0  0  0 
2 2  0  1  1  1 
3 3  0  1  1  0 
4 4  0  1  0  1 
... 

Iは、任意my_data$cell正および負のマーカーのすべての可能な組み合わせでdata.frame、異なっていてどのように、各行/組合せdata.frameを得ることができ

combinations_df <- expand.grid(
    marker_a = c(0, 1), 
    marker_b = c(0, 1), 
    marker_c = c(0, 1), 
    marker_d = c(0, 1) 
) 

    marker_a marker_b marker_c marker_d 
1   0  0  0  0 
2   1  0  0  0 
3   0  1  0  0 
4   1  1  0  0 
5   0  0  1  0 
6   1  0  1  0 
7   0  1  1  0 
8   1  1  1  0 
9   0  0  0  1 
10  1  0  0  1 
11  0  1  0  1 
12  1  1  0  1 
13  0  0  1  1 
14  1  0  1  1 
15  0  1  1  1 
16  1  1  1  1 

を有することができますmy_dataの各行とマッチし、各組み合わせの最終的な数を返します。

試験予想される出力のPLE:

 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 
1 14969 15223 15300 14779 14844 16049 15374 15648 15045 15517 15116 15405 14990 15347 14432 15569 
+1

表示されている例に基づいて予想される出力を更新してください。 –

答えて

1

を必要とするかもしれないことはかなり効率的です。

library(data.table) 
setDT(my_data) 

my_data[ combinations_df, on = names(combinations_df), .N, by = .EACHI ] 


    marker_a marker_b marker_c marker_d N 
1:  0  0  0  0 0 
2:  1  0  0  0 1 
3:  0  1  0  0 0 
4:  1  1  0  0 0 
5:  0  0  1  0 0 
6:  1  0  1  0 0 
7:  0  1  1  0 1 
8:  1  1  1  0 0 
9:  0  0  0  1 0 
10:  1  0  0  1 0 
11:  0  1  0  1 1 
12:  1  1  0  1 0 
13:  0  0  1  1 0 
14:  1  0  1  1 0 
15:  0  1  1  1 1 
16:  1  1  1  1 0 

だけ気にした場合データに表示される組み合わせについて、「チェーン」フィルタリングコマンド:

my_data[ combinations_df, on = names(combinations_df), .N, by = .EACHI ][ N > 0 ] 


    marker_a marker_b marker_c marker_d N 
1:  1  0  0  0 1 
2:  0  1  1  0 1 
3:  0  1  0  1 1 
4:  0  1  1  1 1 

代わりには、このケースでは、あなたも、あなたが「バイナリ」であなたの組み合わせを書いているので、いずれかの必要は参加しませんが、ほんの少しの数学combinations_df ...

my_data[, .N, by = marker_a:marker_d ] 


    marker_a marker_b marker_c marker_d N 
1:  1  0  0  0 1 
2:  0  1  1  1 1 
3:  0  1  1  0 1 
4:  0  1  0  1 1 
0

おそらく、あなたは私がdata.table道を推測している

setNames(sapply(do.call(paste0, combinations_df), 
     function(x) sum(do.call(paste0, my_data[-1])==x)), 1:nrow(combinations_df)) 
1

を必要としません。試してみてください:

setNames(tabulate(as.matrix(my_data[,2:5])%*%2^(0:3)+1,16),1:16) 
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
# 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 
関連する問題