2015-05-28 16 views
6

Ho cercato in alto e in basso per quello che penso sia una soluzione facile.Conversione di un elenco di frame di dati in singoli frame di dati in R

Ho un grande frame di dati che ho diviso per fattori.

eqRegions <- split(eqDataAll, eqDataAll$SeismicRegion)

Questo ora crea un oggetto elenco dei frame di dati per regione; ci sono 8 in totale. Vorrei scorrere l'elenco per creare singoli frame di dati usando un altro nome.

È possibile eseguire quanto segue per convertire gli elementi dell'elenco in singoli frame di dati, ma sto pensando che sia presente un meccanismo di loop rapido se ho molti fattori.

testRegion1 <- eqRegions[[1]]

testRegion3 <- eqRegions[[3]]

posso eseguire manualmente il sopra e gestisce piacevolmente, ma se ho molte regioni non è efficiente. Quello che vorrei fare è l'equivalente di quanto segue:

for (i in 1:length(eqRegions)) { 
    region[i] <- as.data.frame(eqRegions[[i]]) 
} 

Penso che la chiave è quello di definire regione prima del ciclo, ma continuo a sovrascrivere stesso e non incrementare. Grazie molto.

risposta

3

Questo dovrebbe funzionare. Il nome dei data.frames creati sarà uguale ai nomi all'interno di eqDataAll$SeismicRegion. Ad ogni modo, questa pratica di compilare i singoli data.frames non è raccomandata. Più lavoro con R, più amo/uso la lista.

lapply(names(eqRegions), function(x) assign(x, eqRegions[[x]], envir = .GlobalEnv)) 

modifica: utilizzare la soluzione list2env inviata. Non era a conoscenza della funzione list2env.

+0

Ci scusiamo per il downvote, ma questo è inutilmente complicato –

3

attach(eqRegions) dovrebbe essere sufficiente. Ma raccomando di lavorare con loro nel formato list usando lapply. Garantisco che risulterà in un codice più semplice.

+0

Questo pone l'elenco sul tuo percorso di ricerca, quindi le variabili non verranno visualizzate con 'ls', ma nell'esempio nel tuo commento, puoi ottenere' 8' con '' '' 8''''. –

+0

Ciao Matthew, scusa ho cancellato il commento, ripubblicato: non riesco proprio a vedere come funziona: eg 's <- split (mtcars, mtcars $ cyl); attach (s) '. L'uso di 'ls()' non appare, e l'uso di '' 8'' non dà il tavolo finale (funziona se avessi etichettato i lettori di livelli cil [1: 3] – user20650

+1

Per fare riferimento a variabili con nomi non standard, come quelli che iniziano con un numero, circondano il nome in apice inverso anziché virgolette –

17

Prova list2env(eqRegions,envir=.GlobalEnv)

+0

mi hai battuto di pochi secondi! +1 – BrodieG

1

In alternativa, una "best practice" quando si divide i dati in questo modo è quello di mantenere i data.frames all'interno di un elenco, come previsto dalla split. Per elaborarlo, utilizzare uno dei numeri sapply o lapply (molti fattori) e catturare l'output in un elenco. Ad esempio:

eqRegionsProcessed <- lapply(eqRegions, function(df) { 
    ## do something meaningful here 
}) 

Questo ovviamente funziona solo se si sta facendo la stessa cosa su ogni data.frame.

Se davvero devi eliminarli e gestire ogni data.frame in modo univoco, allora le risposte di @ MatthewPlourde e @ MaratTalipov funzioneranno.

1

list2env restituisce i frame di dati all'ambiente globale i cui nomi sono i nomi nell'elenco. Un'alternativa, se si vuole avere lo stesso nome per i frame di dati, ma identificato da I da un ciclo:

for (i in 1:length(eqRegions)) { 
    assign(paste0("eqRegions", i), as.data.frame(eqRegions[[i]])) 
} 

Questo può essere lenta se la lunghezza se la lista diventa troppo lunga.

Problemi correlati