Esta pregunta pide una modificación de la solución a una secuencia de conteo problema: como se señaló en los comentarios, se solicita una tabulación cruzada de co-ocurrencias de valores.
Voy a ilustrar un ingenuo, pero eficaz, de modificación de la con R
código. En primer lugar, vamos a introducir un pequeño conjunto de datos de ejemplo para trabajar con. Es habitual en el formato de matriz, de un caso por cada fila.
x <- matrix(c(3,5,7,10,13,
3,5,8,10,15,
2,5,10,11,18,
1,3,4,6,8,
2,4,6,12,14,
3,5,8,10,15),
ncol=5, byrow=TRUE)
Esta solución genera todas las combinaciones posibles de $m$ artículos (por fila) en un momento y tabula ellos:
m <- 3
x <- t(apply(x, 1, sort))
x0 <- apply(x, 1, combn, m=m)
y <- array(x0, c(m, length(x0)/(m*dim(x)[1]), dim(x)[1]))
ngrams <- apply(y, c(2,3), function(s) paste("(", paste(s, collapse=","), ")", sep=""))
z <- sort(table(as.factor(ngrams)), decreasing=TRUE)
La tabulación se en z
, ordenados en forma descendente de frecuencia. Es útil por sí mismo o fácilmente post-procesado. Aquí están las primeras entradas del ejemplo:
> head(z, 10)
(3,5,10) (3,10,15) (3,5,15) (3,5,8) ... (8,10,15)
3 2 2 2 ... 2
Qué tan eficiente es este? Para $p$ columnas hay $\binom{p}{m}$ combinaciones para trabajar, que crece como $O(p^m)$ fijos $m$: eso es bastante malo, por lo que estamos limitados a un número relativamente pequeño de columnas. Para tener una idea de la cronología, repita lo anterior con una pequeña matriz aleatoria y tiempo. Sigamos con valores entre el $1$ $20,$ decir:
n.col <- 8 # Number of columns
n.cases <- 10^3 # Number of rows
x <- matrix(sample.int(20, size=n.col*n.cases, replace=TRUE), ncol=n.col)
La operación duró dos segundos para tabular todas las $m=3$-combinaciones de $1000$ filas y $8$ columnas. (Se puede ir en un orden de magnitud más rápido mediante la codificación de las combinaciones numéricamente en lugar de cadenas; esto se limita a los casos en que $\binom{p}{m}$ es lo suficientemente pequeño como para ser representados exactamente como un integer o float, limitada a aproximadamente $10^{16}$.) Se escala linealmente con el número de filas. (Aumentando el número de posibles valores de $20$ $20,000$sólo ligeramente alargado el tiempo.) Si que sugiere excesivamente largos tiempos de proceso de un determinado conjunto de datos, a continuación, un método más sofisticado será necesario, tal vez la utilización de los resultados por muy pequeño $m$ a limitar el mayor orden de las combinaciones que se calculan y se cuentan.