我有许多可重复命名的数据框:
df.1 <- data.frame("x"=c(1,2), "y"=2)
df.2 <- data.frame("x"=c(2,4), "y"=4)
df.3 <- data.frame("x"=2, "y"=c(4,5))
Run Code Online (Sandbox Code Playgroud)
所有数据帧都具有相同的行数和列数.我想绑定它们,添加一个具有数据帧ID的列.id将是源数据帧的名称.
我知道我可以手动执行此操作:
rbind(data.frame(id = "df.1", df.1),
data.frame(id = "df.2", df.2),
data.frame(id = "df.3", df.3))
Run Code Online (Sandbox Code Playgroud)
但是它们中有很多,它们的数量将在未来发生变化.
我尝试写for循环,但他们没有工作.我想这是因为我将它们基于包含数据帧名称的字符串列表而不是数据帧本身列表.
df_names <- ls(pattern = "df.\\d+")
for (i in df_names) {
i$id <- i
i
}
Run Code Online (Sandbox Code Playgroud)
...但我还没有找到任何自动创建具有可重复名称的数据框列表的方法.即使我这样做,我也不确定上面的for循环是否可行:)
您可以使用parse
和eval
从df_names
以下位置获取数据帧:
do.call(rbind, lapply(df_names, function(x){data.frame(id=x, eval(parse(text=x)))}))
id x y
1 df.1 1 2
2 df.1 2 2
3 df.2 2 4
4 df.2 4 4
5 df.3 2 4
6 df.3 2 5
Run Code Online (Sandbox Code Playgroud)
还有combine
来自"gdata"的包:
library(gdata)
combine(df.1, df.2, df.3)
# x y source
# 1 1 2 df.1
# 2 2 2 df.1
# 3 2 4 df.2
# 4 4 4 df.2
# 5 2 4 df.3
# 6 2 5 df.3
Run Code Online (Sandbox Code Playgroud)