Używaj nazw obiektów na liście w lapply / ldply

Próbując odpowiedziećpytanie wcześniej natknąłem się na problem, który wydawał się prosty, ale nie mogłem tego zrozumieć.

Jeśli mam listę ramek danych:

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)

To chcęrbind razem mogę wykonać następujące czynności:

df.all <- ldply(df.list, rbind)

Chcę jednak kolejnej kolumny, która określa, któredata.frame każdy rząd pochodzi. Spodziewałem się, że będę mógł użyćdeparse(substitute(x)) metoda (tutaj i gdzie indziej), aby uzyskać nazwę odpowiedniegodata.frame i dodaj kolumnę. Oto jak do niego podszedłem:

fun <- function(x) {
  name <- deparse(substitute(x))
  x$id <- name
  return(x)
}
df.all <- ldply(df.list, fun)

Który wraca

  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]]

Więc oczywiście każdy element listy nie zawiera nazwy, którą uważam, że tak. Czy ktoś może zaproponować sposób uzyskania tego, czego oczekiwałem (pokazanego poniżej)?

  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

questionAnswers(4)

yourAnswerToTheQuestion