2011-06-10 21 views
6

Tengo un conjunto de datos con 10 columnas. La primera columna es un identificador único. Las otras 9 columnas son atributos relacionados. Por ahora, digamos que son enteros. Si es necesario, los datos podrían pivotar fácilmente a una clave-valor.Combinación única de frecuencias

Ex:

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

estoy esencialmente en busca de las combinaciones más frecuentes de cualquier longitud con al menos un par. Así que mi salida para esto sería:

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 

(lo hicieron de forma manual - así que espero que no hay errores) - a la orden del pelado, no importa. 2,5,7 = 5,2,7 = 7,5,2 etc.

¿Alguna idea? Estoy abierto a diferentes herramientas. Tengo acceso a R, excel, sql server, mysql, etc.

Excel es preferido pero no obligatorio.

+0

¿Cuántos atributos hay y cuál es el rango de valores que puede adoptar un atributo? Un algoritmo ingenuo podría no escalar, y no sé si hay algún algoritmo manejable (pero no soy un experto en eso) – frankc

+0

¿Puede explicar cómo obtiene de su conjunto de datos su respuesta? Estoy luchando por dar sentido a "combinaciones más frecuentes de cualquier longitud con al menos un par". –

+0

Conseguí una mejor información. Puede tener de 1 a 9 atributos. @Richie - Básicamente para la fila D - aquí están todas las combinaciones únicas para esa fila (punto y coma delimitado): '1 1,2 1,5 2,5 1,2,5' Así los únicos que califican como "al menos un par" son '1,2 1,5 2,5 1,2,5' ¿Eso ayuda? Por favor, siéntase libre de preguntar nuevamente si no es así. Quiero ser claro en mi respuesta. – elgabito

Respuesta

6

Aquí es una solución en R:

crear los datos

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 

crear una función para enumerar todas las combinaciones

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 
} 

Crear una segunda función para contar las combinaciones

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

Los resultados:

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

Recibí 'Error en aplicar (x [, -1], 1, función (datos) nombre (ordenar (datos))): objeto 'x' no encontrado' Soy MUY nuevo en R, así que quizás hice algo mal ? – elgabito

+0

No, mi error. He editado la pregunta. Todavía había una 'x' al acecho en la función que debería haberse referido a' datos'. Inténtalo de nuevo. – Andrie

+0

tiene usted razón, señor.Ahora para descubrir lo que esto significa. – elgabito

2

están sus datos Aquí, sin la columna de la 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) 
) 

Esto recupera todas las combinaciones, pero la forma de salida requiere un poco de navegación.

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) 
     } 
    ) 
    } 
) 
Cuestiones relacionadas