如何根据各自的数据框名称 [R] 重命名多个列名称(带前缀)

How to rename mutliples columns names (with prefix) according to respective dataframe name [R]

我有 15 个数据框,我已经将它们合并在一起。

  1. 我正在加载我的文件。
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(.))

如果您有任何问题,请告诉我。

  1. 为您的列表命名,然后您可以获得名称前缀:

    List_df_EU = 列表(社区 = 社区,CSR_STRATEGY = CSR_STRATEGY ...)

  2. 要设置 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
  )
}