【发布时间】:2014-11-13 21:41:58
【问题描述】:
我有一堆数据帧生成:
for(i in 1:100){
assign(paste("df", i, sep=""), data.frame(1,2))
}
我想将所有这 100 个数据框的第一列重命名为 Column1。 (请注意,在我的真实数据中,每一列都是唯一的,与此处的示例不同,它们都是 X1。)这对于所有数据帧都是相同的。
对于任何个人,我都可以做到。例如:
names(df45)[1]<-"Column1"
但是,我在尝试自动化该过程时遇到了问题。这是我尝试过的(错误的)代码:
names(eval(parse(text=paste("df", i, sep=""))))[1] <- "Column1"
我应该如何修改这个?有没有比这个更快的方法来访问循环中的变量?
我遇到过其他答案说最好将这些东西放在一个列表中并像这样处理它:
#put into a list
l.df <- lapply(ls(pattern="df[0-9]+"), function(x) get(x))
for(i in 1:100){
names(l.df[[i]])[1] <- "Column1"
}
但是,我希望能够将所有数据框合并在一起,如下所示:
df <- merge(df1, df2, df3, df4, ....... df100, by="Column1")
【问题讨论】:
-
请将数据框放在一个列表中,而不是将它们创建为单独的命名对象。这使得列的重命名和
merge操作变得无限容易(因为无论数据帧的数量如何,相同的代码都可以工作)。 -
@baptiste,假设我已将列名全部更改为
Column1。我不太清楚do.call部分。我试过这个:do.call("merge", c(l.df, by="Column1")). -
如果合并允许超过 2 个 data.frames 作为参数,那将会起作用。在这里你可以使用
Reduce(function(x,y)merge(x,y,by="Column1"), l.df) -
很高兴知道。谢谢!