我有一个包含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(我仍然非常适合新手)。即使是微小的示例数据,它也非常慢。
我在搜索时发现了这个: Apply a function to each data frame。 如何应用于数据帧的子集?
我认为一个好的答案可以找到在数据框列表中应用数据帧子集的方法,该函数可以更改最后五个列名称。这样做不必多次读取大量列表。
还有一些事情,我不知道在这种情况下将字符串转换为变量名(数据框名称)的最有效方法。我应该使用eval以外的东西(as.name())吗?我正在使用R 3.03。
感谢您的帮助。
答案 0 :(得分:1)
试试这个:
a[1:2] <- lapply(a[1:2], function(thisdf) {
names(thisdf)[(length(thisdf)-4):length(thisdf)] <- paste0('Column',2:6)
thisdf
})
基本上,使用lapply
就像使用for
循环一样,更改指定数据框的指定列的名称。这会生成一个数据框列表,然后您可以将其存储回原始列表中。
结果:
> 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
答案 1 :(得分:1)
或者只使用colnames
colnames(a[[1]])<- c("X1","col2","col3","col4","col5","col6")