【发布时间】:2013-02-19 07:16:55
【问题描述】:
在之前尝试回答a question 时,我遇到了一个看起来应该很简单的问题,但我想不通。
如果我有一个数据框列表:
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)) 方法(here 和其他地方)来获取相关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
【问题讨论】:
-
不完全是答案,但您可能对here 使用的各种方法感兴趣。
-
不使用命名列表是在自取其辱。