2013-10-17 18 views
7

Ho una lista di frame di dati che ho bisogno di ottenere l'ultima riga della seconda colonna da. Tutti i frame di dati hanno un numero diverso di righe. Ho già scritto il codice usando lapply che può estrarre qualsiasi riga dalla variabile "num" (restituendo NA per i numeri che superano la lunghezza della riga dei frame di dati), tuttavia voglio includere una variabile num = "worst" che restituirà la variabile ultima riga, 2a colonna dei dati disponibili. Questo è il codice per retrive riga "ennesima" (xyz è la lista dei frame di dati):Stampa l'ultima riga da un elenco di frame di dati

if(num=="best"){num=as.integer(1)} else 
(num=as.integer()) 

rownumber<-lapply(xyz, "[", num, 2, drop=FALSE) 

stato il giro la mia testa tutto il giorno cercando di trovare una soluzione per dichiarare num == "peggiore". Voglio evitare i loop quindi il mio uso di lapply, ma forse non c'è altro modo?

+0

Utilizzare la funzione 'tail' con' lapply'. 'tail' ha un argomento' n'. – A5C1D2H2I1M1N2O1R2T1

risposta

2

La mia comprensione della questione è che si desidera una funzione che restituisce la seconda colonna di una data.frame da un list di dataframes, con un argomento opzionale worst che consente di limitarlo all'ultima osservazione.

Penso che il modo più semplice per farlo è quello di scrivere una funzione di supporto, e quindi applicarla alla lista usando lapply.

Ho scritto una funzione selector che accetta un argomento di riga e colonna, nonché un argomento worst. Penso che questo faccia tutto ciò di cui hai bisogno.

df1 <- data.frame(A = rnorm(10), B = rnorm(10), C = rnorm(10)) 
df2 <- data.frame(A = rnorm(10), B = rnorm(10), C = rnorm(10)) 
ldf <- list(df1, df2) 

selector <- function(DF, col, row=NULL, worst=FALSE){ 
    if(!is.null(row)) return(DF[row, col]) 
    if(!missing("col")) if(col > ncol(DF)) return(NA) 
    if(!is.null(row)) if(row > nrow(DF)) return(NA) 
    if(worst) { 
     tail(DF[,col, drop=F],1) 
    } else { 
     DF[row, col, drop=FALSE] 
    } 
} 

lapply(ldf, selector, worst=T) 
14

ne dite ...

lapply(xyz, tail, 1) 
+1

+1 ovviamente :) – A5C1D2H2I1M1N2O1R2T1

+0

@Jiber, non penso che questo risponda alla domanda reale - l'OP voleva aiutare a scrivere una funzione che seleziona le combinazioni di righe e colonne, con un argomento 'worst' che restituisce l'ultima riga. – ricardo

Problemi correlati