2012-10-06 25 views
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)允許一個(可以是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 

與在不同變量下存在單個失配相同。

(3)「 - 」表示缺失值,可以類似方式在匹配整數意味着允許一個錯配處理。

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

但是,如果有兩個缺失值然後組合被聲明未知( - )

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 

任何想法?

+0

只是一個小想法,你可以合併到VAR1 VAR5創造新的因素 - 例如(AABAA等),那麼你可以在這個變量工作...我不知道我們如何能夠在單一的不匹配工作 – jon

回答

1

這是我該怎麼做的。這個想法是創建一個距離矩陣,所以你可以將你的數據聚類到它們之間具有零距離的行組中。

首先,讓我們除去(暫時),其具有兩個或多個破折號行:

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

+0

謝謝你有趣的方式來做到這一點。所以這裏玩是h值,以允許更多或更少的不匹配...... 7和13應在同一組,因爲他們只有一個錯配... – SHRram

+0

還創建距離矩陣是緩慢的過程,當我有1000個個人 – SHRram

+0

一方面,你說7和13應該屬於同一類別,因爲它們只有一個不匹配,而另一方面你會區分組合1(ABABB)和組合2(AAABB)。我不認爲我的輸出會受到這種不一致的影響。 – flodel