Tengo que dividir un vector en n fragmentos del mismo tamaño en R. No pude encontrar ninguna función base para hacer eso. Además, Google no me llevó a ninguna parte. Así que aquí está lo que se me ocurrió, espero que ayude a alguien en algún lugar.
x <- 1:10
n <- 3
chunk <- function(x,n) split(x, factor(sort(rank(x)%%n)))
chunk(x,n)
$`0`
[1] 1 2 3
$`1`
[1] 4 5 6 7
$`2`
[1] 8 9 10
Cualquier comentario, sugerencia o mejora son realmente bienvenidos y apreciados.
Saludos, Sebastian
x <- c(NA, 4, 3, NA, NA, 2, 1, 1, NA ); y <- letters[x]; z <- factor(y)
da ejemplos con datos faltantes, valores repetidos, que aún no están ordenados, y están en diferentes clases (entero, carácter, factor).Respuestas:
Una línea dividida en trozos de tamaño 20:
Más detalles: creo que todo lo que necesitas es
seq_along()
,split()
yceiling()
:fuente
n
trozos de igual tamaño. Esto te da un número desconocido de trozos de tamañon
. Tuve el mismo problema y utilicé las soluciones de @mathheadinclouds.n-chunks
que solíamax <- length(d)%/%n
. Utilicé esto con un vector de 31 cadenas y obtuve una lista de 3 vectores de 10 oraciones y uno de 1 oración.fuente
fuente
Pruebe la función ggplot2
cut_number
:fuente
x
,y
oz
definido en este comentario . En particular, clasifica los resultados, que pueden o no estar bien, dependiendo de la aplicación.Esto lo dividirá de manera diferente a lo que tienes, pero creo que sigue siendo una estructura de lista bastante buena:
Lo que te dará lo siguiente, dependiendo de cómo quieras formatearlo:
Ejecutar un par de tiempos usando esta configuración:
Luego tenemos los siguientes resultados:
EDITAR: Cambiar de as.factor () a as.character () en mi función lo hizo el doble de rápido.
fuente
Algunas variantes más de la pila ...
Tenga en cuenta que no necesita usar la
factor
función aquí, pero aún así desea quesort
su primer vector sea1 2 3 10
:O puede asignar índices de caracteres, viceversa los números en los ticks de la izquierda arriba:
O puede usar nombres de palabras simples almacenados en un vector. Tenga en cuenta que usar
sort
para obtener valores consecutivos enx
orden alfabético las etiquetas:fuente
Usando la base R
rep_len
:Y como ya se mencionó si desea índices ordenados, simplemente:
fuente
Puede combinar la división / corte, como lo sugiere mdsummer, con cuantil para crear grupos pares:
Esto da el mismo resultado para su ejemplo, pero no para variables sesgadas.
fuente
split(x,matrix(1:n,n,length(x))[1:length(x)])
Quizás esto sea más claro, pero la misma idea:
split(x,rep(1:n, ceiling(length(x)/n),length.out = length(x)))
si quieres ordenarlo, arroja una especie a su alrededor
fuente
Necesitaba la misma función y he leído las soluciones anteriores, sin embargo, también necesitaba tener el fragmento desequilibrado para estar al final, es decir, si tengo 10 elementos para dividirlos en vectores de 3 cada uno, entonces mi resultado debería tener vectores con 3, 3,4 elementos respectivamente. Así que usé lo siguiente (dejé el código sin optimizar para facilitar la lectura, de lo contrario no es necesario tener muchas variables):
fuente
Aquí hay otra variante.
NOTA: con esta muestra, especificará el TAMAÑO DE CHUNK en el segundo parámetro
fuente
Función simple para dividir un vector simplemente usando índices: no es necesario complicarlo demasiado
fuente
Si no le gusta
split()
y no le gustamatrix()
(con sus NA colgantes), hay esto:Al igual que
split()
, devuelve una lista, pero no pierde tiempo ni espacio con etiquetas, por lo que puede ser más eficiente.fuente
Crédito a @Sebastian por esta función
fuente
Si no te gusta
split()
y no te molesta que los NA rellenen tu cola corta:Las columnas de la matriz devuelta ([, 1: ncol]) son los droides que está buscando.
fuente
Necesito una función que tome el argumento de un data.table (entre comillas) y otro argumento que es el límite superior en el número de filas en los subconjuntos de ese data.table original. Esta función produce cualquier número de tablas de datos que el límite superior permita:
Esta función me da una serie de tablas de datos llamadas df_ [número] con la fila inicial de la tabla de datos original en el nombre. La última tabla de datos puede ser corta y estar llena de NA, por lo que debe volver a configurar los datos restantes. Este tipo de función es útil porque, por ejemplo, cierto software GIS tiene límites sobre cuántos pines de dirección puede importar. Por lo tanto, puede que no sea recomendable dividir data.tables en fragmentos más pequeños, pero es posible que no se pueda evitar.
fuente
Lo siento si esta respuesta llega tan tarde, pero tal vez pueda ser útil para otra persona. En realidad, hay una solución muy útil para este problema, explicada al final de? Split.
fuente
Otra posibilidad más es la
splitIndices
función del paqueteparallel
:Da:
fuente
Wow, esta pregunta obtuvo más tracción de lo esperado.
Gracias por todas las ideas. Se me ocurrió esta solución:
La clave es usar el parámetro seq (each = chunk.size) para que funcione. Usar seq_along actúa como rank (x) en mi solución anterior, pero en realidad es capaz de producir el resultado correcto con entradas duplicadas.
fuente
Esto se divide en trozos de tamaño ⌊n / k⌋ + 1 o ⌊n / k⌋ y no utiliza el orden O (n log n).
fuente