2011-06-10 105 views
6

我有一個包含10列的數據集。第一列是唯一標識符。其他9列是相關的屬性。現在,我們只是說它們是整數。如果需要,數據可以很容易地轉換爲鍵值。唯一組合頻率

例:

id|attr1|attr2|attr3|... 
a | 2 | 5 | 7 |... 
b | 3 | 1 |null |... 
c | 2 |null |null |... 
d | 1 | 2 | 5 |... 
e | 2 | 1 | 3 |... 

我本質上尋找任何長度的至少一對最常見的組合。所以我對這個輸出是:

unq | frequency 
1,2 | 2 
1,3 | 2 
1,5 | 1 
2,3 | 1 
2,5 | 2 
2,7 | 1 
1,2,3 | 1 
1,2,5 | 1 
2,5,7 | 1 

(手動這樣做 - 所以希望沒有錯誤) - 在配對的順序並不重要。 2,5,7 = 5,2,7 = 7,5,2 etc.

有什麼想法?我對不同的工具開放。我有權訪問R,excel,sql server,mysql等。

Excel是首選,但不是必需的!

+0

有多少屬性,以及屬性可以採用的值的範圍是多少?一個天真的算法可能不會擴展,我不知道是否有任何易於理解的算法(但我不是這方面的專家) – frankc 2011-06-10 15:33:05

+0

你能解釋你如何從你的數據集到你的答案?我正在努力理解「至少有一對任何長度的最常見的組合」。 – 2011-06-10 16:24:23

+0

得到了一些更好的信息。它可以有1到9個屬性。 @Richie - 基本上爲行d - 這裏是所有該行(分號分隔)的獨特組合: '1 1,2- 1,5- 2,5- 1,2,5-' 所以唯一符合「至少一對」標準的是 1,2 1,5 2,5 1,2,5' 這有幫助嗎?如果沒有,請隨時再問一次。我想在我的答案中清楚。 – elgabito 2011-06-10 16:40:55

回答

6

這裏是R中的溶液:

重新創建數據

x <- data.frame(
    id = letters[1:5], 
    attr1 = c(2,3,2,1,2), 
    attr2 = c(5,1,NA,2,1), 
    attr3 = c(7,NA,NA,5,3)) 
x 

    id attr1 attr2 attr3 
1 a  2  5  7 
2 b  3  1 NA 
3 c  2 NA NA 
4 d  1  2  5 
5 e  2  1  3 

創建功能列出所有組合

make_combinations <- function(data, size){ 
    t1 <- apply(data[, -1], 1, function(data)unname(sort(data))) 
    t2 <- lapply(t1, function(xt){if(length(xt)>=size){combn(xt, size)}}) 
    t3 <- sapply(t2[!is.na(t2)], 
     function(chunk){if(!is.null(chunk))apply(chunk, 2, function(x)paste(x, collapse=","))}) 
    t4 <- unlist(t3) 
    t4 
} 

創建第二個函數來計算組合

count_combinations <- function(data, nn=2:3){ 
    tmp <- unlist(lapply(nn, function(n)make_combinations(data, n))) 
    sort(table(tmp), decreasing=TRUE) 
} 

結果:

count_combinations(x, 2:3) 


    1,2 1,3 2,5 1,2,3 1,2,5 1,5 2,3 2,5,7 2,7 5,7 
    2  2  2  1  1  1  1  1  1  1 
+0

我得到'應用程序錯誤(x [,-1],1,函數(數據)未命名(排序(數據))): 對象'x'未找到'我很新的R,所以也許我做了錯誤? – elgabito 2011-06-10 17:04:37

+0

不,我的錯誤。我編輯了這個問題。函數中仍然存在一個'x',它應該引用'data'。請再試一次。 – Andrie 2011-06-10 17:12:33

+0

你是正確的先生。現在弄清楚這是什麼意思。 – elgabito 2011-06-10 17:13:56

2

這是你的數據,而不id列。

dfr <- data.frame(
    attr1 = c(2,3,2,1,2), 
    attr2 = c(5,1,NA,2,1), 
    attr3 = c(7,NA,NA,5,3) 
) 

這將檢索所有組合,但輸出表單需要一點導航。

lapply(
    seq_len(nrow(dfr)),    #loop over rows 
    function(row) 
    { 
    lapply(
     seq_along(dfr)[-1],   #loop over lengths of combination, -1 is to ignore singletons 
     function(m) 
     { 
     combn(dfr[row, ], m) 
     } 
    ) 
    } 
)