2012-08-24 2 views
6

병합과 관련하여 예기치 않은 동작이 나타납니다 (또는 적어도 전체적으로 직관적이지는 않음).병합으로 비공식 설정

이의 첫 번째 놀이 몇 가지 더미 데이터를 만들어 보자 : 그러나 아마 난 그냥이 일을 해야하는 방법을 이해하고 있지 않다

x <- structure(list(A = c(2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L), B = c(2L, 2L, 1L, 2L, 
1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L 
), C = c(2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 
2L, 1L, 1L, 1L, 1L, 2L, 2L), D = c(2L, 1L, 2L, 2L, 2L, 1L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L), E = c(2L, 
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L), F = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L), G = c(2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L), 
    H = c(1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 
    1L, 2L, 1L, 2L, 1L, 1L, 1L), I = c(1L, 1L, 2L, 2L, 2L, 1L, 
    1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L), 
    J = c(2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    2L, 2L, 2L, 2L, 1L, 2L, 1L), K = c(3, 3, 1, 3, 1, 3, 1, 2, 
    2, 2, 1, 3, 2, 2, 2, 1, NA, 1, 2, 1)), .Names = c("A", "B", 
"C", "D", "E", "F", "G", "H", "I", "J", "K"), row.names = c(NA, 
20L), class = "data.frame") 

# Generate Listing of All Possible Combinations 
y <- list(1:2); y = expand.grid(rep(y,10)); 
colnames(y) <- LETTERS[1:10] 
y <- rbind(y,y,y) 
y$K <- rep(1:3,each=1024) 
y$mergekey <- sample(1:6,3072,replace=TRUE) 

내 기대 나는 이것들을 병합 할 때이 데이터를 설정한다는 점입니다 sort=FALSE을 설정하고 all.x=TRUE은 모든 x의 목록을 mergekey으로 제공합니다.

은의 그 해보자 :
merge(x,y,all.x=TRUE,sort=FALSE) 
    A B C D E F G H I J K mergekey 
1 2 2 2 2 2 1 2 1 1 2 3  5 
2 2 2 1 1 1 1 2 2 1 1 3  3 
3 2 1 2 2 1 1 2 1 2 2 1  3 
4 2 2 1 2 2 1 2 2 2 2 3  2 
5 1 1 2 2 2 2 2 1 2 2 1  4 
6 2 1 1 1 2 2 2 2 1 2 3  6 
7 1 1 1 1 2 2 2 2 1 2 1  5 
8 2 1 2 2 1 1 2 2 1 1 2  4 
9 2 2 2 1 1 1 2 1 2 2 2  4 
10 2 1 2 2 1 1 2 1 1 1 2  2 
11 2 1 2 1 1 1 2 1 2 2 1  4 
12 2 2 1 2 1 2 2 1 2 1 3  5 
13 2 1 2 1 1 1 2 1 2 2 2  3 
14 2 1 2 1 1 1 2 1 2 2 2  3 
15 2 2 2 1 2 1 2 1 2 2 2  1 
16 2 1 1 2 1 1 2 2 2 2 2  1 
17 2 1 1 1 1 1 2 1 1 2 1  2 
18 1 2 1 1 1 2 2 1 1 1 1  5 
19 2 1 2 1 1 1 2 1 1 1 1  4 
20 2 2 1 2 1 1 1 2 1 2 NA  NA 

는 이제 "X의 대부분은 분류되지 않은 것입니다"하지만 incomparables가 아니라 순서를 유지하는 것보다, 끝까지 밀어 것으로 보인다.

제 질문은 다음과 같습니다. 어떻게 비교할 수없는 것을 얻을 수 있습니까?

추 신 : 병합 작업을 정렬하지 말라고 말하면 불일치를 끝까지 밀어내는 것이 비현실적이지 않습니까? this 동작과 일치하지 않습니다.

답변

3

plyr 패키지의 join 기능은이 문제를 추가적인 논쟁없이 직관적으로 해결합니다.

library(plyr) 
join(x,y) 

Joining by: A, B, C, D, E, F, G, H, I, J, K 
    A B C D E F G H I J K mergekey 
1 2 2 2 2 2 1 2 1 1 2 3  4 
2 2 2 1 1 1 1 2 2 1 1 3  3 
3 2 1 2 2 1 1 2 1 2 2 1  5 
4 2 2 1 2 2 1 2 2 2 2 3  3 
5 1 1 2 2 2 2 2 1 2 2 1  6 
6 2 1 1 1 2 2 2 2 1 2 3  6 
7 1 1 1 1 2 2 2 2 1 2 1  4 
8 2 1 2 2 1 1 2 2 1 1 2  2 
9 2 2 2 1 1 1 2 1 2 2 2  4 
10 2 1 2 2 1 1 2 1 1 1 2  6 
11 2 1 2 1 1 1 2 1 2 2 1  1 
12 2 2 1 2 1 2 2 1 2 1 3  3 
13 2 1 2 1 1 1 2 1 2 2 2  2 
14 2 2 2 1 2 1 2 1 2 2 2  6 
15 2 1 1 2 1 1 2 2 2 2 2  2 
16 2 1 1 1 1 1 2 1 1 2 1  3 
17 2 2 1 2 1 1 1 2 1 2 NA  NA 
18 1 2 1 1 1 2 2 1 1 1 1  1 
19 2 1 2 1 1 1 2 1 2 2 2  2 
20 2 1 2 1 1 1 2 1 1 1 1  1 
관련 문제