在尝试早先回答一个问题时,我遇到了一个看起来应该很简单的问题,但我无法弄清楚。
如果我有数据框列表:
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)
我想rbind
在一起,我可以做到以下几点:
df.all <- ldply(df.list, rbind)
但是,我想要另一列来标识data.frame
每一行的来源。我希望能够使用该deparse(substitute(x))
方法(此处和其他地方)来获取相关名称data.frame
并添加一列。这就是我的处理方式:
fun <- function(x) {
name <- deparse(substitute(x))
x$id <- name
return(x)
}
df.all <- ldply(df.list, fun)
哪个返回
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]]
所以显然列表中的每个元素都不包含我认为的名称。谁能建议一种方法来获得我的期望(如下所示)?
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