独特的组合频率

我有一个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 |... 

我基本上是寻找任何长度的最频繁的组合,至less有一对。 所以我的输出是这样的:

 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服务器,MySQL等

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

R:这里是一个解决scheme:

重新创build数据

 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 

创build一个函数来列出所有的组合

 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 } 

创build第二个函数来计算组合

 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 

这里是你的数据,没有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) } ) } )