2013-08-04 3 views
5

Sto pulendo diversi file Excel in R. Sfortunatamente sono di dimensioni, righe e colonne non uguali. Attualmente sto memorizzando ogni foglio Excel come un frame di dati in un elenco. So come stampare il 4 ° riga della prima frame di dati in una lista mediante l'emissione di questo comando:Stampa l'ennesima riga in un elenco di frame di dati

df.list1[[1]][4,] 

o un intervallo di righe come questa:

df.list1[[1]][1:10,] 

La mia domanda è: Come faccio stampare una riga particolare per ogni frame di dati nella lista? In altre parole:

df.list1[[i]][4,] 

df.list1 ha 30 frame di dati in esso, ma la mia altra df.lists avere oltre 140 frame di dati che sto cercando di estrarre le loro file. Mi piacerebbe essere in grado di memorizzare particolari posizioni su più frame di dati in un nuovo elenco. Sto pensando che la soluzione potrebbe coinvolgere lapply.

Inoltre, esiste un modo per estrarre le righe in ogni frame di dati in un elenco in base a una condizione? Ad esempio, per tutti i 30 frame di dati nell'elenco df.list1, estrarre la riga se il valore è uguale a "Apartment" o qualche altra stringa di caratteri.

Apprezzare il vostro aiuto, per favore fatemi sapere se posso aiutare a chiarire il mio problema.

risposta

12

Si potrebbe anche solo lapply direttamente la funzione di estrazione @Justin suggerisce, per esempio:

# example data of a list containing 10 data frames: 
test <- replicate(10,data.frame(a=1:10),simplify=FALSE) 

# extract the fourth row of each one - setting drop=FALSE means you get a 
# data frame returned even if only one vector/column needs to be returned. 
lapply(test,"[",4,,drop=FALSE) 

il formato è:

lapply(listname,"[",rows.to.return,cols.to.return,drop=FALSE) 

# the example returns the fourth row only from each data frame 
#[[1]] 
# a 
#4 4 
# 
#[[2]] 
# a 
#4 4 
# etc... 

generalizzare questo quando si sta completando un'estrazione base a una condizione, che avrebbe dovuto cambiare un po 'a qualcosa come nell'esempio qui sotto estrarre tutte le righe in cui a in ogni data.frame è >4. In questo caso, l'utilizzo di anonymous function è probabilmente il metodo più chiaro, ad es.:

lapply(test, function(x) with(x,x[a>4,,drop=FALSE])) 

#[[1]] 
# a 
#5 5 
#6 6 
#7 7 
#8 8 
#9 9 
#10 10 
# etc... 
+0

Molto utile! Ho utilizzato questo metodo per un paio di giorni, ma potresti mostrarmi un esempio di estrazione di una riga in base a una condizione? questo è sbagliato, ma potresti ancora avere l'idea: lapply (test, "[", if (row = "Apartment") ,, drop = FALSE) – geoQuant

+0

@geoQuant - Ho modificato la mia risposta per includerla - spero che aiuti . – thelatemail

+0

'lapply (test, sottoinsieme, a> 4)' in alternativa – baptiste

4

Il mio suggerimento è quello di scrivere una funzione che fa quello che si vuole su un singolo fotogramma di dati:

myfun <- function(dat) { 
    return(dat[4, , drop=FALSE]) 
} 

Se si desidera tornare come vettore anziché data.frame, basta fare: return(dat[4, ]) insteaad. Quindi utilizzare lapply di applicare tale funzione per ogni elemento della vostra lista:

lapply(df.list1, myfun) 

Con questa tecnica, si può facilmente trovare dei modi per estendere myfun a funzioni più complesse ...

+0

approccio fresco. Grazie, ma non riesco a far funzionare mia figlia. – geoQuant

+0

@geoQuant, era una piccola svista. Dovrebbe andare bene ora – Arun

5

Non è necessario per una funzione involucro, basta usare lapply e passare un argomento vuoto alla fine (per rappresentare le colonne)

lapply(df.list, `[`, 4,) 

Questo funziona anche con qualsiasi tipo di argomento riga che si usa normalmente in myDF[ . , ] es: lapply(df.list, [, c(2, 4:6),)

.


vorrei suggerire che se avete intenzione di utilizzare una funzione wrapper, farli funzionare più come [ fa: ad esempio

Grab(df.list, 2:3, 1:5) avrebbe selezionare la seconda & terza fila e primo al 5 colonna di ogni data.frame e Grab (df.list, 2:3) sarebbe selezionare la seconda & terza fila di tutte le colonne

Grab <- function(ll, rows, cols) { 
    if (missing(cols)) 
     lapply(ll, `[`, rows,) 
    else 
     lapply(ll, `[`, rows, cols) 
} 

Grab (df.list, 2:3) 
0

ad esempio, si dispone di un file .csv chiamato hw1_data.csv e si desidera recuperare la riga 47 °. Ecco come fare:

x<-read.csv("hw1_data.csv") 

x[47,] 

Se si tratta di un file di testo è possibile utilizzare read.table.