3

いくつかのミスマッチを許容しながら、ユニークな組み合わせを作成する必要があります。次に例を示します。

set.seed (1234)
dataf <- data.frame (var1 = sample( c("A", "B", "-"),20, replace = T),
            var2 = sample( c("A"),20, replace = T),
            var3 = sample( c("B", "B", "B", "-"),20, replace = T),
            var4 = sample( c("A","A", "A",  "-"),20, replace = T),
            var5 = sample( c("A", "B", "A", "A", "-"),20, replace = T)
            )
 dataf

ルール:

(1) ユニークな組み合わせの生成:

     A B     A  B  B   - combination 1
    A  A     A  B  B    - combination 2
    B  B     B  A  A    - combination 3 
   so on ...

(2) カテゴリを作成するために 1 つ (n の場合もある) の不一致を許可します。例えば:

A   B    A  B  B
A   A    A  B  B
B   A    A  B  B
B   A    B  B  B 
B   A    A  B  A

異なる変数で 1 つの不一致があるのと同じです。

(3) "-" は欠損値を示します。マッチングの整数と同様に扱うことができ、1 つのミスマッチが許容されることを意味します。

A   B    A  B  B
 A   -    A  B  B
 A   B    A  -  B

ただし、欠損値が 2 つある場合、組み合わせは不明 (-) と宣言されます。

 A   B    A  B  B
 A   -    A  -  B
 A   B    A  -  -

以下は、上記のデータのワークアウトです。

    var1 var2 var3 var4 var5       comb
1     A    A    B    -    -       -

2     B    A    B    A    A        1
3     B    A    B    A    A        1
4     B    A    B    A    A        1
5     -    A    B    A    A        1
6     B    A    B    A    -        1

7     A    A    B    A    B        2
8     A    A    B    A    B        2

9     B    A    B    A    A        1

10    B    A    -    A    -        -

11    -    A    B    A    A        1

12    B    A    B    -    -        -

13    A    A    B    A    A        2

14    -    A    B    -    A        -

15    A    A    B    A    A        2
16    -    A    B    A    A        2
17    A    A    B    A    B        2

18    A    A    -    A    A        3

19    A    A    B    A    B        2

20    A    A    -    A    A        3

何か案が ?

4

1 に答える 1

1

これが私がそれを行う方法です。アイデアは、距離行列を作成することです。これにより、データをそれらの間の距離がゼロの行のグループにクラスター化できます。

まず、ダッシュが 2 つ以上ある行を (一時的に) 削除しましょう。

two.dashes <- apply(dataf, 1, function(x)sum(x == '-') >= 2)
subdata <- dataf[!two.dashes,]

次に、距離行列を計算しましょう。

mydist.fun <- function(i, j, x = subdata) {
   row.i <- x[i, ]
   row.j <- x[j, ]
   idx   <- row.i != '-' & row.j != '-'
   sum(row.i[idx] != row.j[idx])
}
rows.idx  <- seq_len(nrow(subdata))
rows.dist <- as.dist(outer(rows.idx, rows.idx, Vectorize(mydist.fun)))

次に、クラスタリングを使用してデータをグループ化しましょう。私は完全な階層的クラスタリングを使用して、それを でカットしていheight = 0ます。つまり、それらの間の距離がすべてゼロのポイントのグループを作成しています。

hc <- hclust(rows.dist)
members <- cutree(hc, h = 0)

すべてをまとめましょう:

comb <- rep('-', nrow(dataf))
comb[!two.dashes] <- members
dataf$comb <- comb
dataf
#    var1 var2 var3 var4 var5 comb
# 1     A    A    B    -    -    -
# 2     B    A    B    A    A    1
# 3     B    A    B    A    A    1
# 4     B    A    B    A    A    1
# 5     -    A    B    A    A    1
# 6     B    A    B    A    -    1
# 7     A    A    B    A    B    2
# 8     A    A    B    A    B    2
# 9     B    A    B    A    A    1
# 10    B    A    -    A    -    -
# 11    -    A    B    A    A    1
# 12    B    A    B    -    -    -
# 13    A    A    B    A    A    3
# 14    -    A    B    -    A    -
# 15    A    A    B    A    A    3
# 16    -    A    B    A    A    1
# 17    A    A    B    A    B    2
# 18    A    A    -    A    A    3
# 19    A    A    B    A    B    2
# 20    A    A    -    A    A    3

これは、期待される出力の矛盾を明らかにしています。たとえば、行 7 と 13 は同じグループに属してはなりません。また、行 16 のように、別のグループに移動できる単一ダッシュの行もあります。

于 2012-10-06T17:26:28.803 に答える