首页 > 解决方案 > 使用不断变化的列表重命名 R 数据框中的列的函数

问题描述

我经常准备我在工作中分享的统计数据汇总表。这些表格通常包含相同类型的数据和列标题(例如违反章程的数量、单位数量等)。我经常使用 R 数据框中的速记列名(“nbbldg”、“nbunits”、“nbvl”)或从导入表继承的其他列名。这是一个例子:

df <-
  data.frame(
    DESCRIPTION_TXT_BLW = c(
      "Missing plumbing fixture",
      "Improperly installed heating unit",
      "Loose or damaged siding",
      "Peeling paint"
    ),
    DESCR_UNIT = c("Apartment", "Apartment", "Common area", "Common area"),
    nbvl = as.integer(c(12, 4, 76, 4))
  )

然后,在通过以下函数(提供的示例列表)导出到 csv 之前,我将列名转换为它们的“可读”对应项:

changecolnames<-function (df, codetotext) 
{
  lapply(names(df), function(x) {
    if (x %in% names(codetotext)) {
      codetotext[[x]]
    }
    else {
      x
    }
  })
}

readablecolnames <-
      list(
        "DESCR_UNIT" = "Description of unit",
        "DESCRIPTION_TXT_BLW" = "Description of bylaw violation",
        "nbvl" = "Number of bylaw violations"
      )

names(df)<-changecolnames(df, readablecolnames)

到目前为止,我有项目特定的列表,允许我转换列名。我想将不同的列表聚合成一个可从任何 R 项目(在 RStudio 中)访问的全局列表,并不断添加。我的目标是避免在每个项目中创建一个列表,而是引用一种易于更新的主“库”。实现这一目标的最佳方法是什么?

标签: r

解决方案


我要做的是有一个包含此名称列表的中央 R 文件,然后source将其加载到每个项目中。

如果您希望将名称对保存在.csv文件中,则此 R 文件可以改为从单个文件生成名称列表,而不是自己保存:

name_pairs.csv:

short_name,full_name
DESCR_UNIT,Description of unit
DESCRIPTION_TXT_BLW,Description of bylaw violation
nbvl,Number of bylaw violations

load_name_pairs.R:

name_pairs <- read.table('~/Desktop/test/name_pairs.csv', sep = ',',
                         header = TRUE, stringsAsFactors = FALSE)

readablecolnames <- name_pairs$full_name
names(readablecolnames) <- name_pairs$short_name
rm(name_pairs)

在您的 R 项目开始时:

source('~/Desktop/test/load_name_pairs.r')
readablecolnames


           DESCR_UNIT              DESCRIPTION_TXT_BLW                             nbvl 
"Description of unit" "Description of bylaw violation"     "Number of bylaw violations" 

如您所见,通过使用sourceon load_name_pairs.r,文件中的所有代码都将sourced运行,并且将对象移植到sourcing环境中。因此,只需在项目文件中添加一行,您就可以加载和解析中心.csv文件并访问项目中的结果。


推荐阅读