遍历全局环境并将数据框重命名为小写字母,没有特殊字符(在 R 中)

looping through the global environment and rename the dataframes to lowercase with no special characters (in R)

在提出以下问题之前,我查看了 this, and this 讨论: 在我的全局环境中,我有数据集、列表和其他向量。我想删除所有特殊字符并应用 tolower() 函数 globally 到这些数据框。

因此,名为 TTxxSSS 的数据集将为 ttxxsss。名为 çã 的数据集将是 ca.

-我想我必须循环遍历环境对象并仅重命名数据集。
-我可以推广到其他任务的解决方案将是惊人的(即 trim 名称等)。那是代码:

ds1_01_HaPpy <- data.frame(x=rep(10,10))
df_02_PÇaPp6 <- data.frame(x=rep(10,10))
df_ZzZzzzzZZ <- data.frame(x=rep(10,10))
x <- c(12,3)
a <- list("a","b" ,"c")

谢谢

遍历名称并对每个数据框进行音译并转换为小写。如果这导致名称与原始名称不同并且新名称不存在,则默认情况下发出消息并重命名。

有参数可用于关闭消息(详细),允许覆盖现有对象(覆盖), 允许处理以点开头的名称(全部)并在不进行任何更改的情况下对其进行测试(测试)。

clean_dfs <- function(envir = .GlobalEnv, all = FALSE, 
    overwrite = FALSE, test = FALSE, verbose = TRUE) {
  for(nm in ls(all = all, envir)) {
    .tmp <- get(nm, envir)
    if (is.data.frame(.tmp)) {
      newnm <- tolower(iconv(nm, to = "ASCII//TRANSLIT"))
      if (nm != newnm) {
        if (exists("newnm", envir) && !overwrite) {
          warning(newnm, " already exists -- ", nm, " not renamed")
        } else {
          if (verbose) cat("renaming", nm, "to", newnm, "\n")
          if (!test) {
            assign(newnm, .tmp, envir)
            rm(list = nm, envir = envir)
          } 
        }
      }
    }
  }
}

测试一下,然后 运行 它。

# test without making any changes
clean_dfs(test = TRUE)
## renaming df_02_PÇaPp6 to df_02_pcapp6 
## renaming df_ZzZzzzzZZ to df_zzzzzzzzz 
## renaming ds1_01_HaPpy to ds1_01_happy 

ls() # unchanged
## [1] "a"            "clean_dfs"    "df_02_PÇaPp6" "df_ZzZzzzzZZ" "ds1_01_HaPpy"
## [6] "x"    

# now run it for real
clean_dfs()
## renaming df_02_PÇaPp6 to df_02_pcapp6 
## renaming df_ZzZzzzzZZ to df_zzzzzzzzz 
## renaming ds1_01_HaPpy to ds1_01_happy 

ls()
## [1] "a"            "clean_dfs"    "df_02_pcapp6" "df_zzzzzzzzz" "ds1_01_happy"
## [6] "x"