Nel tentativo di rispondere allo a question in precedenza, mi sono imbattuto in un problema che sembrava essere semplice, ma non riuscivo a capirlo.Usa nomi oggetto in un elenco in lapply/ldply
Se ho un elenco di dataframes:
df1 <- data.frame(a=1:3, x=rnorm(3))
df2 <- data.frame(a=1:3, x=rnorm(3))
df3 <- data.frame(a=1:3, x=rnorm(3))
df.list <- list(df1, df2, df3)
Che voglio rbind
insieme, posso effettuare le seguenti operazioni:
df.all <- ldply(df.list, rbind)
Tuttavia, voglio un'altra colonna che identifica quale data.frame
ogni è venuta la fila. Mi aspettavo di essere in grado di utilizzare il metodo deparse(substitute(x))
(here e altrove) per ottenere il nome del relativo data.frame
e aggiungere una colonna. Questo è come mi sono avvicinato esso:
fun <- function(x) {
name <- deparse(substitute(x))
x$id <- name
return(x)
}
df.all <- ldply(df.list, fun)
che restituisce
a x id
1 1 1.1138062 X[[1L]]
2 2 -0.5742069 X[[1L]]
3 3 0.7546323 X[[1L]]
4 1 1.8358605 X[[2L]]
5 2 0.9107199 X[[2L]]
6 3 0.8313439 X[[2L]]
7 1 0.5827148 X[[3L]]
8 2 -0.9896495 X[[3L]]
9 3 -0.9451503 X[[3L]]
Quindi, ovviamente, ogni elemento della lista non contiene il nome credo di sì. Qualcuno può suggerire un modo per ottenere quello che mi aspettavo (mostrato sotto)?
a x id
1 1 1.1138062 df1
2 2 -0.5742069 df1
3 3 0.7546323 df1
4 1 1.8358605 df2
5 2 0.9107199 df2
6 3 0.8313439 df2
7 1 0.5827148 df3
8 2 -0.9896495 df3
9 3 -0.9451503 df3
Non esattamente una risposta, ma si potrebbe essere interessati a vari metodi utilizzati [qui] (http://stackoverflow.com/q/15162197/324364). – joran
Spararsi nel piede non usando una lista nominata. –