2012-09-14 19 views
11

Ho frame di dati con struttura seguente:R: elementi scissi di una lista in sottoliste

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 è suddiviso in una lista di elementi:

all.inc = split(df, inc) 

Ora voglio dividere ogni elemento di questa lista in sotto-liste. Qualcosa di simile:

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

Questo non funziona, ovviamente. Ho già provato le funzioni plyr e lapply, ma non l'ho fatto funzionare.

Qualche idea?

risposta

7

Uso lapply:

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

Ok, funziona. Di conseguenza ottengo una lista con la stessa lunghezza (10) di all.inc. Ma voglio che ogni elemento, ad esempio, all.pat [1] sia un singolo elemento di lista. all.pat [1] ha la lunghezza 1, ma dovrebbe avere lunghezza 3. L'intero elenco dovrebbe avere lunghezza 30, in questo caso. Spero, questo è chiaro ?! – Markus

+0

@Markus, perché la lista è * nidificata *. L'indicizzazione delle sotto-liste richiederebbe: 'length (all.pat [[1]])'. – A5C1D2H2I1M1N2O1R2T1

+0

ok, nessun problema. Ho appena trovato la funzione "unlist". Con l'opzione ricorsiva = F fornisce il risultato desiderato. Grazie molto! – Markus

6

Se vuoi per dividere il frame di dati tutti in una volta, è possibile utilizzare

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

Tuttavia, il valore restituito sarà una lista unica dei dati frame, che è leggermente diverso da quello che otterresti dividendo gli elementi della lista.

+0

Qual è la differenza tra l'uso di 'interaction' e' list' ('split (df, list (df $ ...)' qui? Mi piace molto di più di ciò che l'OP sta facendo perché trovo che trattare con gli elenchi annidati può +1. – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab, a quanto pare, non c'è differenza (a meno che 'identico' mi stia mentendo).' split.default' chiama 'interaction' su' f' se 'f' è una lista, però, quindi ho pensato di interrompere questo passaggio: se l'OP sta eseguendo calcoli dopo la prima divisione, quindi la divisione di nuovo, quindi la mia soluzione non aiuterà. +1 a voi! – BenBarnes

+0

@ RomanLuštrik, ho controllato e non lo fa Crea anche un elenco unico di (in questo caso) 30 frame di dati. Mi chiedevo solo se un metodo è più fortemente raccomandato dell'altro - ho sempre usato l'approccio 'list'. – A5C1D2H2I1M1N2O1R2T1

Problemi correlati