我有许多可重复命名的数据框:
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))
所有数据框都具有相同的行数和列数。 我想绑定它们,添加一个具有数据帧ID的列。 id将是源数据框的名称。
我知道我可以手动执行此操作:
rbind(data.frame(id = "df.1", df.1),
data.frame(id = "df.2", df.2),
data.frame(id = "df.3", df.3))
但是它们中有很多,未来它们的数量会发生变化。
我尝试编写for循环,但它们不起作用。我想这是因为我将它们基于包含数据帧名称的字符串列表而不是数据帧本身列表。
df_names <- ls(pattern = "df.\\d+")
for (i in df_names) {
i$id <- i
i
}
...但我还没有找到任何自动创建具有可重复名称的数据框列表的方法。即使我这样做,我也不确定上面的for循环是否有效:)
答案 0 :(得分:5)
“gdata”包中还有combine
:
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
答案 1 :(得分:4)
您可以使用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
答案 2 :(得分:2)
使用mget
的另一种方法:
dat <- do.call(rbind, mget(df_names))
dat$id <- sub("\\.\\d+$", "", rownames(dat))
# x y id
# df.1.1 1 2 df.1
# df.1.2 2 2 df.1
# df.2.1 2 4 df.2
# df.2.2 4 4 df.2
# df.3.1 2 4 df.3
# df.3.2 2 5 df.3