2012-09-14 23 views
11

I tienen trama de datos con estructura siguiente:R: elementos de división de una lista en sublistas

pat = c(rep(1, 50), rep(2, 50), rep(3, 50)) 
inc = rep(c(rep(1, 5), rep(2, 5), rep(3, 5), rep(4, 5), rep(5, 5), rep(6, 5), 
rep(7, 5), rep(8, 5), rep(9, 5), rep(10, 5)), 3) 
df = data.frame(cbind(pat, inc)) 

df se divide en una lista de elementos:

all.inc = split(df, inc) 

Ahora desea dividir cada elemento de esta lista en sub-listas. Algo como:

all.pat = split(all.inc, pat) 

Esto no funciona, obviamente. Ya probé las funciones plyr y lapply, pero no conseguí que funcionara.

¿Alguna idea?

Respuesta

7

Uso lapply:

lapply(all.inc, function(x) split(x, x$pat)) 
+0

Ok, funciona. Como resultado, estoy obteniendo una lista con la misma longitud (10) que all.inc. Pero quiero tener cada elemento en, por ejemplo, all.pat [1] para ser un elemento de lista única. all.pat [1] tiene la longitud 1, pero debe tener una longitud 3. La lista completa debe tener una longitud de 30, en este caso. Espero, esto es claro? – Markus

+0

@Markus, eso es porque la lista está * anidada *. La indexación de las sub-listas requeriría: 'length (all.pat [[1]])'. – A5C1D2H2I1M1N2O1R2T1

+0

bien, no hay problema. Acabo de encontrar la función "unlist". Con la opción recursiva = F, entrega el resultado deseado. ¡Muchas gracias! – Markus

6

Si desea dividir la trama de datos a la vez, podría utilizar

split(df, interaction(df$pat,df$inc)) 

Sin embargo, el valor devuelto será una lista única de datos marcos, que es ligeramente diferente de lo que obtendría al dividir los elementos de la lista.

+0

¿Cuál es la diferencia entre usar 'interaction' y' list' ('split (df, list (df $ ...)' aquí? En realidad me gusta esto mejor que lo que hace el OP porque me parece que lidiar con listas anidadas puede ser engorroso a veces. +1. – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab, al parecer, no hay diferencia (a menos que "idéntico" me mienta). 'split.default' llama' interaction' sobre 'f' si' f' es una lista, sin embargo, así que pensé en cortar ese paso. Si el OP realiza cálculos después de la primera división, y luego se divide de nuevo, entonces mi solución no ayudará. +1 a usted! – BenBarnes

+0

@ RomanLuštrik, lo revisé y no lo hace También crea una lista única de (en este caso) 30 marcos de datos. Me preguntaba si un método es más recomendado que el otro: siempre he usado el enfoque 'list' – A5C1D2H2I1M1N2O1R2T1

Cuestiones relacionadas