使用 lapply 更改数据框列表的列名
Using lapply to change column names of a list of data frames
我正在尝试在数据框列表上使用 lapply;但未能正确传递参数(我认为)。
数据帧列表:
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:
更改列名
lapply (listDF, function(x) { colnames(x)[2:length(x)] <-todos[1:length(x)-1] } )
但这根本不会更改名称。我不是在传递数据框本身,而是在传递其他东西吗?我只是想更改名称,而不是将结果 return 更改为新对象。
提前致谢,p.
试试这个:
lapply (listDF, function(x) {
names(x)[-1] <- todos[-length(x)]
x
})
您将获得一个包含已更改数据框的新列表。如果你想直接操作listDF
:
for (i in 1:length(listDF)) names(listDF[[i]])[-1] <- todos[-length(listDF[[i]])]
如果要替换所有列也可以使用setNames
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
的解决方案
lapply(listDF, function(df) {
names(df)[-1] <- new_col_name[-ncol(df)]
df
})
最后一点,在 R 中 a:b - 1 和 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
的名称相同。
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
我无法使这些答案中使用的代码起作用。我从另一个论坛找到了一些有效的代码。这会将新的列名分配给每个数据框,其他方法创建数据框的副本。对于其他人,这里是代码。
# Create some dataframes
df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40)
listDF <- c("df1", "df2") #Notice this is NOT a list
new_col_name <- c("C", "D") #What do you want the new columns to be named?
# Assign the new column names to each dataframe in "listDF"
for(df in listDF) {
df.tmp <- get(df)
names(df.tmp) <- new_col_name
assign(df, df.tmp)
}
我正在尝试在数据框列表上使用 lapply;但未能正确传递参数(我认为)。
数据帧列表:
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:
更改列名lapply (listDF, function(x) { colnames(x)[2:length(x)] <-todos[1:length(x)-1] } )
但这根本不会更改名称。我不是在传递数据框本身,而是在传递其他东西吗?我只是想更改名称,而不是将结果 return 更改为新对象。
提前致谢,p.
试试这个:
lapply (listDF, function(x) {
names(x)[-1] <- todos[-length(x)]
x
})
您将获得一个包含已更改数据框的新列表。如果你想直接操作listDF
:
for (i in 1:length(listDF)) names(listDF[[i]])[-1] <- todos[-length(listDF[[i]])]
如果要替换所有列也可以使用setNames
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
的解决方案lapply(listDF, function(df) {
names(df)[-1] <- new_col_name[-ncol(df)]
df
})
最后一点,在 R 中 a:b - 1 和 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
的名称相同。
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
我无法使这些答案中使用的代码起作用。我从另一个论坛找到了一些有效的代码。这会将新的列名分配给每个数据框,其他方法创建数据框的副本。对于其他人,这里是代码。
# Create some dataframes
df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40)
listDF <- c("df1", "df2") #Notice this is NOT a list
new_col_name <- c("C", "D") #What do you want the new columns to be named?
# Assign the new column names to each dataframe in "listDF"
for(df in listDF) {
df.tmp <- get(df)
names(df.tmp) <- new_col_name
assign(df, df.tmp)
}