2011-06-10 65 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) 
     } 
    ) 
    } 
)