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) 

私の期待は、これら 2 つのデータ セットをマージする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 はソートされていない」ように見えますが、比較できないものは順序を維持するのではなく、最後までプッシュされます。

それで、私の質問は次のとおりです。比類のないものを所定の位置に保つにはどうすればよいですか

PS: マージがソートしないように指示されている場合、比較できないものを最後までプッシュするのは少し直感的ではないように思えませんか? これもこの振る舞いと一致しているとは思いません

4

1 に答える 1

3

パッケージ内のjoin関数は、plyr追加の引数なしで直感的にこの問題を解決します。

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
于 2012-08-30T17:24:05.090 に答える