根据列表变量设置多个数据框的名称
Setting colnames of several data frames based on a list variable
我有一个以相同方式构建的多个数据框的列表。我想将每个数据框的第 1 列的名称更改为数据框本身的名称并附加一些文本。从几个不同的答案中,我认为 lapply 处理列表是最好的方法。
示例数据:
df1 <- data.frame(A = 1, B = 2, C = 3)
df2 <- data.frame(A = 1, B = 2, C = 3)
dfList <- list(df1,df2)
col1 <- names(dfList)
df<-lapply(dfList, function(x) {
names(x)[1:2] <- c(col1[1:length(col1)]"appended text","Col2","Col3");x
})
问题似乎出在我的代码中为每个数据帧调用 "col1" 变量中的正确条目。
关于我应该如何正确解决/表达这个问题的任何想法?非常感谢!
我不确定我是否完全理解你的问题,但这是你想要的吗:
df1 <- data.frame(A = 1, B = 2, C = 3)
df2 <- data.frame(A = 1, B = 2, C = 3)
dfList <- list(df1,df2)
df <- lapply(dfList, function(x) {
colnames(x) <- c(paste0(colnames(x)[1], "appended text"), colnames(x)[2:length(colnames(x))])
return(x)
})
输出:
> df
[[1]]
Aappended text B C
1 1 2 3
[[2]]
Aappended text B C
1 1 2 3
df1<-data.frame(A = 1, B = 2, C = 3)
df2<-data.frame(A = 1, B = 2, C = 3)
dfList <- list(df1=df1,df2=df2)
names(dfList)
col1 <- names(dfList)
for(i in 1:length(dfList))
names(dfList[[names(dfList[i])]])[1]<-names(dfList)[i]
dfList
这里有一个选项tidyverse
library(tidyverse)
map(dfList, ~ .x %>%
rename(Aappended_text = A))
如果这是基于列索引,创建一个函数
fName <- function(lst, new_name, index){
map(lst, ~
.x %>%
rename_at(index, funs(paste0(., new_name))))
}
fName(dfList, "appended_text", 1)
您可以简单地使用 lapply
lapply(dfList, function(x) {
names(x)[1L] <- "some text"
x
})
但是如果你想用列表中数据框元素的名称重命名,首先你需要给它们命名,例如dfList <- list(df1 = df1, df2 = df2)
并且您不能直接使用 lapply(x, ...
访问它们,因此您需要 lapply
通过索引遍历您的列表,例如:
lapply(seq_along(dfList), function(i) {
names(dfList[[i]])[1L] <- names(dfList[i])
dfList[[i]]
})
我有一个以相同方式构建的多个数据框的列表。我想将每个数据框的第 1 列的名称更改为数据框本身的名称并附加一些文本。从几个不同的答案中,我认为 lapply 处理列表是最好的方法。
示例数据:
df1 <- data.frame(A = 1, B = 2, C = 3)
df2 <- data.frame(A = 1, B = 2, C = 3)
dfList <- list(df1,df2)
col1 <- names(dfList)
df<-lapply(dfList, function(x) {
names(x)[1:2] <- c(col1[1:length(col1)]"appended text","Col2","Col3");x
})
问题似乎出在我的代码中为每个数据帧调用 "col1" 变量中的正确条目。 关于我应该如何正确解决/表达这个问题的任何想法?非常感谢!
我不确定我是否完全理解你的问题,但这是你想要的吗:
df1 <- data.frame(A = 1, B = 2, C = 3)
df2 <- data.frame(A = 1, B = 2, C = 3)
dfList <- list(df1,df2)
df <- lapply(dfList, function(x) {
colnames(x) <- c(paste0(colnames(x)[1], "appended text"), colnames(x)[2:length(colnames(x))])
return(x)
})
输出:
> df
[[1]]
Aappended text B C
1 1 2 3
[[2]]
Aappended text B C
1 1 2 3
df1<-data.frame(A = 1, B = 2, C = 3)
df2<-data.frame(A = 1, B = 2, C = 3)
dfList <- list(df1=df1,df2=df2)
names(dfList)
col1 <- names(dfList)
for(i in 1:length(dfList))
names(dfList[[names(dfList[i])]])[1]<-names(dfList)[i]
dfList
这里有一个选项tidyverse
library(tidyverse)
map(dfList, ~ .x %>%
rename(Aappended_text = A))
如果这是基于列索引,创建一个函数
fName <- function(lst, new_name, index){
map(lst, ~
.x %>%
rename_at(index, funs(paste0(., new_name))))
}
fName(dfList, "appended_text", 1)
您可以简单地使用 lapply
lapply(dfList, function(x) {
names(x)[1L] <- "some text"
x
})
但是如果你想用列表中数据框元素的名称重命名,首先你需要给它们命名,例如dfList <- list(df1 = df1, df2 = df2)
并且您不能直接使用 lapply(x, ...
访问它们,因此您需要 lapply
通过索引遍历您的列表,例如:
lapply(seq_along(dfList), function(i) {
names(dfList[[i]])[1L] <- names(dfList[i])
dfList[[i]]
})