使用lapply来更改数据帧列表的列名 [英] Using lapply to change column names of a list of data frames
问题描述
我试图在数据框列表中使用 lapply 但是没有正确地传递参数(我想)。
I'm trying to use lapply on a list of data frames; but failing at passing the parameters correctly (I think).
数据框列表:
df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40)
listDF <- list(df1, df2,df3) #multiple data frames w. way less columns than the length of vector todos
带有列名称的向量:
todos <-c('col1','col2', ......'colN')
我想使用lapply更改列名称:
I'd like to change the column names using lapply:
lapply (listDF, function(x) { colnames(x)[2:length(x)] <-todos[1:length(x)-1] } )
但这并不会改变名字。我没有自己传递数据框,但还有其他的?我只想改变名字,而不是将结果返回给一个新对象。
but this doesn't change the names at all. Am I not passing the data frames themselves, but something else? I just want to change names, not to return the result to a new object.
提前感谢p。
推荐答案
如果要替换所有列,您还可以使用 setNames
You can also use setNames
if you want to replace all columns
df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40)
listDF <- list(df1, df2)
new_col_name <- c("C", "D")
lapply(listDF, setNames, nm = new_col_name)
## [[1]]
## C D
## 1 1 11
## 2 2 12
## 3 3 13
## 4 4 14
## 5 5 15
## 6 6 16
## 7 7 17
## 8 8 18
## 9 9 19
## 10 10 20
## [[2]]
## C D
## 1 21 31
## 2 22 32
## 3 23 33
## 4 24 34
## 5 25 35
## 6 26 36
## 7 27 37
## 8 28 38
## 9 29 39
## 10 30 40
如果您只需要替换列名称的一部分,则可以使用@Jogo的解决方案
If you need to replace only a subset of column names, then you can use the solution of @Jogo
lapply(listDF, function(df) {
names(df)[-1] <- new_col_name[-ncol(df)]
df
})
最后一点,在R中,a:b - 1和a之间有区别:(b - 1)
A last point, in R there is a difference between a:b - 1 and a:(b - 1)
1:10 - 1
## [1] 0 1 2 3 4 5 6 7 8 9
1:(10 - 1)
## [1] 1 2 3 4 5 6 7 8 9
编辑
如果要从列表中更改全局环境中 data.frame
的列名称,可以使用 list2env
但我不知道这是实现想要的最佳方式。您还需要修改列表并使用命名列表,名称应该与您需要替换的 data.frame
的名称相同。
If you want to change the column names of the data.frame
in global environment from a list, you can use list2env
but I'm not sure it is the best way to achieve want you want. You also need to modify your list and use named list, the name should be the same as name of the data.frame
you need to replace.
listDF <- list(df1 = df1, df2 = df2)
new_col_name <- c("C", "D")
listDF <- lapply(listDF, function(df) {
names(df)[-1] <- new_col_name[-ncol(df)]
df
})
list2env(listDF, envir = .GlobalEnv)
str(df1)
## 'data.frame': 10 obs. of 2 variables:
## $ A: int 1 2 3 4 5 6 7 8 9 10
## $ C: int 11 12 13 14 15 16 17 18 19 20
这篇关于使用lapply来更改数据帧列表的列名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!