如何根据各自的数据框名称 [R] 重命名多个列名称(带前缀)
How to rename mutliples columns names (with prefix) according to respective dataframe name [R]
我有 15 个数据框,我已经将它们合并在一起。
- 我正在加载我的文件。
data_files <- list.files() # Identify file names
for(i in 1:length(data_files)) {
assign(paste0(substr(data_files[i],1,nchar(data_files[i])-4)),
read_excel(paste0("",
data_files[i])))
}
问题,它们具有相同的列名。这就是为什么我想用以下代码重命名列:
colnames(COMMUNITY)
[1] "OBJECTID" "SOURCE_ID" "mean" "LMiIndex Fixed 450000 RS"
[5] "LMiZScore Fixed 450000 RS" "LMiPValue Fixed 450000 RS" "COType Fixed 450000 RS" "NNeighbors Fixed 450000 RS"
[9] "ZTransform Fixed 450000 RS" "SpatialLag Fixed 450000 RS"
colnames(COMMUNITY) <-paste("PREFIX",colnames(COMMUNITY),sep="-")
我想对我的 15 个数据帧执行此操作,所以我尝试了这个:
List_df_EU = list(COMMUNITY,CSR_STRATEGY, EMISSIONS,ENV_PILLAR,ESGCOMBINED,ESGCONTROVERSIES,
ESGSCORE,GOV_PILLAR,HUMANRIGHTS,INNOVATION,MANAGEMENT,PRODUCT_RESP, RESSOURCE_USE, SOC_PILLAR, WORKFORCE)
for(i in 1:length(List_df_EU)) {
colnames(List_df_EU[i]) <-paste("AS",colnames(List_df_EU[i]),sep="_")
}
它不起作用,而且,我不知道如何检索数据框名称,以便将他作为列的前缀。
我可以分别为每个数据帧做这件事,但这会花费很长时间,而且不会很聪明。
即使经过许多网络研究,我也从未找到自动化的东西。
之后,我使用以下代码行进行合并,它确实有效,但正如预期的那样,每个 colnames 都是相同的。
Merged_file <- purrr::reduce(List_df_EU, dplyr::left_join, by = 'OBJECTID', suffix = c(".x", ".y"))
最简单的方法可能是将它们全部放入同一列,但添加一列以指示它们来自哪个文件。您也可以 pivot_wider
然后再次将它们分开。
此功能用于填写将用于标识源文件的列。
library(tidyverse)
library(data.table)
add_name <- function(flnm) {
fread(flmn) %>%
mutate(filename = basename(flmn))
}
使用它来收集文件并构建数据框。
mergedDF <- list.files(urlOrObject) %>%
map_df(~add_name(.))
如果您有任何问题,请告诉我。
为您的列表命名,然后您可以获得名称前缀:
List_df_EU = 列表(社区 = 社区,CSR_STRATEGY = CSR_STRATEGY ...)
要设置 colnames 缺少 []:
colnames(List_df_EU[[i]]) <- ...
首先,用双方括号引用列表中的元素,例如 List_df_EU[[i]]
(List_df_EU[i]
是 1 个元素的 sub-list,而不是元素本身)。
其次,我们可以使用 tibble::lst()
而不是 list()
创建 List_df_EU
,以便自动命名元素。然后,"AS"
可以替换为names(List_df_EU)[i]
。
List_df_EU <- tibble::lst(....)
for(i in 1:length(List_df_EU)) {
colnames(List_df_EU[[i]]) <- paste(
names(List_df_EU)[i], colnames(List_df_EU[[i]]), sep = "_")
}
编辑
为了允许在 OBJECTID
上进行后续连接,我们可以重命名除 OBJECTID
之外的所有列,例如使用 dplyr
有一个很好的接口:
for(i in 1:length(List_df_EU)) {
List_df_EU[[i]] <- dplyr::rename_with(
List_df_EU[[i]],
~ paste(names(List_df_EU)[i], .x, sep = "_"),
.cols = - OBJECTID
)
}
我有 15 个数据框,我已经将它们合并在一起。
- 我正在加载我的文件。
data_files <- list.files() # Identify file names
for(i in 1:length(data_files)) {
assign(paste0(substr(data_files[i],1,nchar(data_files[i])-4)),
read_excel(paste0("",
data_files[i])))
}
问题,它们具有相同的列名。这就是为什么我想用以下代码重命名列:
colnames(COMMUNITY)
[1] "OBJECTID" "SOURCE_ID" "mean" "LMiIndex Fixed 450000 RS"
[5] "LMiZScore Fixed 450000 RS" "LMiPValue Fixed 450000 RS" "COType Fixed 450000 RS" "NNeighbors Fixed 450000 RS"
[9] "ZTransform Fixed 450000 RS" "SpatialLag Fixed 450000 RS"
colnames(COMMUNITY) <-paste("PREFIX",colnames(COMMUNITY),sep="-")
我想对我的 15 个数据帧执行此操作,所以我尝试了这个:
List_df_EU = list(COMMUNITY,CSR_STRATEGY, EMISSIONS,ENV_PILLAR,ESGCOMBINED,ESGCONTROVERSIES,
ESGSCORE,GOV_PILLAR,HUMANRIGHTS,INNOVATION,MANAGEMENT,PRODUCT_RESP, RESSOURCE_USE, SOC_PILLAR, WORKFORCE)
for(i in 1:length(List_df_EU)) {
colnames(List_df_EU[i]) <-paste("AS",colnames(List_df_EU[i]),sep="_")
}
它不起作用,而且,我不知道如何检索数据框名称,以便将他作为列的前缀。
我可以分别为每个数据帧做这件事,但这会花费很长时间,而且不会很聪明。
即使经过许多网络研究,我也从未找到自动化的东西。
之后,我使用以下代码行进行合并,它确实有效,但正如预期的那样,每个 colnames 都是相同的。
Merged_file <- purrr::reduce(List_df_EU, dplyr::left_join, by = 'OBJECTID', suffix = c(".x", ".y"))
最简单的方法可能是将它们全部放入同一列,但添加一列以指示它们来自哪个文件。您也可以 pivot_wider
然后再次将它们分开。
此功能用于填写将用于标识源文件的列。
library(tidyverse)
library(data.table)
add_name <- function(flnm) {
fread(flmn) %>%
mutate(filename = basename(flmn))
}
使用它来收集文件并构建数据框。
mergedDF <- list.files(urlOrObject) %>%
map_df(~add_name(.))
如果您有任何问题,请告诉我。
为您的列表命名,然后您可以获得名称前缀:
List_df_EU = 列表(社区 = 社区,CSR_STRATEGY = CSR_STRATEGY ...)
要设置 colnames 缺少 []:
colnames(List_df_EU[[i]]) <- ...
首先,用双方括号引用列表中的元素,例如 List_df_EU[[i]]
(List_df_EU[i]
是 1 个元素的 sub-list,而不是元素本身)。
其次,我们可以使用 tibble::lst()
而不是 list()
创建 List_df_EU
,以便自动命名元素。然后,"AS"
可以替换为names(List_df_EU)[i]
。
List_df_EU <- tibble::lst(....)
for(i in 1:length(List_df_EU)) {
colnames(List_df_EU[[i]]) <- paste(
names(List_df_EU)[i], colnames(List_df_EU[[i]]), sep = "_")
}
编辑
为了允许在 OBJECTID
上进行后续连接,我们可以重命名除 OBJECTID
之外的所有列,例如使用 dplyr
有一个很好的接口:
for(i in 1:length(List_df_EU)) {
List_df_EU[[i]] <- dplyr::rename_with(
List_df_EU[[i]],
~ paste(names(List_df_EU)[i], .x, sep = "_"),
.cols = - OBJECTID
)
}