Уникальная комбинационная частота - PullRequest
6 голосов
/ 10 июня 2011

У меня есть набор данных с 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 является предпочтительным, но не обязательно!

Ответы [ 2 ]

6 голосов
/ 10 июня 2011

Вот решение в 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 
2 голосов
/ 10 июня 2011

Вот ваши данные без столбца 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)
      }
    )
  }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...