【发布时间】:2014-04-15 17:11:52
【问题描述】:
我有一个包含 21 个非常大的数据框的列表。对于其中 11 个数据框,我想更改最后 5 列的名称。
这是一些示例代码,显示了与我的数据相同的基本结构。
x<-data.frame(matrix(data=rep("2",12),ncol=6))
y<-data.frame(matrix(data=rep("3",12),ncol=6))
z<-data.frame(matrix(data=rep("4",12),ncol=6))
a<-list(x,y,z)
> a
[[1]]
X1 X2 X3 X4 X5 X6
1 2 2 2 2 2 2
2 2 2 2 2 2 2
[[2]]
X1 X2 X3 X4 X5 X6
1 3 3 3 3 3 3
2 3 3 3 3 3 3
[[3]]
X1 X2 X3 X4 X5 X6
1 4 4 4 4 4 4
2 4 4 4 4 4 4
这是我想要的输出:
>a
[[1]]
X1 Column2 Column3 Column4 Column5 Column6
1 2 2 2 2 2 2
2 2 2 2 2 2 2
[[2]]
X1 Column2 Column3 Column4 Column5 Column6
1 3 3 3 3 3 3
2 3 3 3 3 3 3
[[3]]
X1 X2 X3 X4 X5 X6
1 4 4 4 4 4 4
2 4 4 4 4 4 4
目前这是我不满意的方法:
x<-data.frame(matrix(data=rep("2",12),ncol=6))
y<-data.frame(matrix(data=rep("3",12),ncol=6))
z<-data.frame(matrix(data=rep("4",12),ncol=6))
a<-list(x,y,z)
data_frames_to_change<-c("x","y")
library("data.table")
for (i in 1:length(data_frames_to_change)){
setnames(eval(as.name(data_frames_to_change[i])),colnames(eval(as.name(data_frames_to_change[i]))[2:6]),c("Column2","Column3","Column4","Column5","Column6"))
}
a<-list(x,y,z)
我知道这段代码不仅不好,因为它使用循环而不是应用(我仍然是应用新手)。即使在很小的示例数据上,它也非常慢。
我在搜索时发现了这个: Apply a function to each data frame。 如何应用于数据帧的子集?
我认为一个好的答案是找到将更改最后五个列名称的函数应用于数据帧列表中的数据帧子集的方法。这样做时,它不必多次阅读大量列表。
还有几件事,我不知道在这种情况下将字符串转换为变量名称(数据框名称)的最有效方法。我应该使用 eval(as.name()) 以外的东西吗?我正在使用 R 3.03。
感谢您的帮助。
【问题讨论】: