2016-10-11 3 views
1

"양수"(1) 또는 "음수"(0) 데이터 포인트가있는 큰 데이터 프레임이 있습니다.벡터/행이 데이터 프레임과 일치하는 횟수를 확인하십시오.

데이터 예 나는 긍정적이고 부정적인 마커의 모든 가능한 조합과 다른 data.frame

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 
... 

my_data$cell 어디 각 행/조합 나는 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 

당신이 경우에만 관리 데이터에 나타나는 조합에 대해 "체인"필터링 명령 :

,451,515,
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 

또는,이 경우에 당신은 어떤 너무 필요에 가입하지만, 단지 약간의 수학, 당신은 "진"에 조합을 작성하는 ...

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

combinations_df을 필요로하지 않습니다. 사용해보기 :

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 
관련 문제