【问题标题】:How to fix spaces in column names of a data.frame (remove spaces, inject dots)?如何修复 data.frame 列名中的空格(删除空格,注入点)?
【发布时间】:2012-05-28 02:58:27
【问题描述】:

导入文件后,我总是尝试从列名中删除空格,以便更轻松地引用列名。

除了使用转换然后删除此命令创建的额外列之外,还有更好的方法吗?

这是我现在使用的:

names(ctm2)
#tranform function does this, but requires some action
ctm2<-transform(ctm2,dymmyvar=1)
#remove dummy column
ctm2$dymmyvar <- NULL
names(ctm2)

【问题讨论】:

  • 使用inject.dots函数:inject.dots &lt;- function(df) {names(df) &lt;- sub(" ", ".", names(df));df}
  • 严肃地说,我很惊讶 R 导入带有空格的列名并且不会自动修复它。
  • @TylerRinker read.table 函数默认使用make.names 函数执行此操作。
  • @TylerRinker:是的。两者都是read.csv/read.table(..., check.names=T)。默认值为 TRUE。

标签: r dataframe


【解决方案1】:

为此目的存在更优雅和通用的解决方案:

tidy.name.vector <- make.names(name.vector, unique=TRUE)

make.names() 从字符向量中生成语法上有效的名称。语法上有效的名称由字母、数字和点或下划线字符组成,并以字母或点开头,后跟数字。

此外,unique=TRUE 标志可让您避免新列名中可能出现的重复。

作为代码来实现

d<-read_delim(urltxt,delim='\t',)
names(d)<-make.names(names(d),unique = TRUE)

【讨论】:

  • 格栅解决方案。这里有一个整洁的选择:df %&gt;% dplyr::rename_all(funs(make.names(.)))
  • funs() 从 dplyr 0.8.0 开始被软性弃用,所以现在一个整洁的替代方案是:df %&gt;% dplyr::rename_all(list(~make.names(.)))
  • df %&gt;% rename_all(make.names)
  • rename_all()dplyr 1.0.7. 取代,所以最好使用df %&gt;% rename_with(make.names)
【解决方案2】:

有一个非常有用的包,称为janitor,它使清理列名变得非常简单。它会删除所有唯一字符并用_ 替换空格。

library(janitor)

#can be done by simply
ctm2 <- clean_names(ctm2)

#or piping through `dplyr`
ctm2 <- ctm2 %>%
        clean_names()

【讨论】:

    【解决方案3】:

    要仅替换每列中的第一个空格,您还可以这样做:

    names(ctm2) <- sub(" ", ".", names(ctm2))
    

    或替换所有空格(这似乎更有用):

    names(ctm2) <- gsub(" ", "_", names(ctm2))
    

    或者,如第一个答案中所述(尽管不是以修复所有空格的方式):

    spaceless <- function(x) {colnames(x) <- gsub(" ", "_", colnames(x));x}
    newDF <- spaceless(ctm2)
    

    其中 x 是您的 data.frame 的名称。我更喜欢使用“_”来避免“。”的问题。作为 ID 的一部分。

    关键是 gsub 不会在模式匹配的第一个实例处停止。

    【讨论】:

    • 这个问题,至少在我这边,是:如果一个列名有多个空格,它只会替换第一个
    【解决方案4】:

    这样命名。这效果最好。它将名称中的所有空格替换为下划线。

    names(ctm2)&lt;-gsub("\\s","_",names(ctm2))

    【讨论】:

    • 迄今为止最直接、最简洁的解决方案。
    【解决方案5】:

    dplyr::select_all() 可用于重新格式化列名。此示例将空格和句点替换为下划线并将所有内容转换为小写:

    iris %>%  
      select_all(~gsub("\\s+|\\.", "_", .)) %>% 
      select_all(tolower) %>% 
      head(2)
      sepal_length sepal_width petal_length petal_width species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    

    【讨论】:

      【解决方案6】:

      目前我发现的最佳解决方案是

      names(ctm2) %<>% stringr::str_replace_all("\\s","_") %>% tolower
      

      归功于评论者和其他答案

      【讨论】:

      • 有没有办法将其集成到应用类型函数中,以便重命名多个数据集中的列?
      【解决方案7】:

      或者,您也可以使用stringr 包获得相同的结果。

      names(ctm2) &lt;- names(ctm2) %&gt;% stringr::str_replace_all("\\s","_")

      【讨论】:

        【解决方案8】:

        在一大块dplyr 代码中更改列的名称通常比在创建数据框后重命名列更方便。在这些情况下,rename_all() 中的管道非常有用:

        ctm2 %>% rename_all(function(x) gsub(" ", "_", x))
        

        上面的代码会将每个列名中的所有空格替换为下划线。

        【讨论】:

          【解决方案9】:

          截至 2021 年 1 月:简洁且不使用额外库的 drplyr 解决方案是

          df %<>% dplyr::rename_all(make.names)
          

          功劳归评论者所有。

          【讨论】:

            【解决方案10】:

            有一种简单的方法可以删除 data.table 中列名中的空格。您必须将数据框转换为数据表。

            setnames(x=DT, old=names(DT), new=gsub(" ","",names(DT)))
            

            Country Code 将转换为CountryCode

            【讨论】:

            • 省略 old 会得到相同的结果。 (这在文档中有介绍。)
            【解决方案11】:

            只需分配给names(ctm2)

              names(ctm2) <- c("itsy", "bitsy", "eeny", "meeny")
            

            或以数据驱动的方式:

              names(ctm2) <- paste("myColumn", 1:ncol(ctm2), sep="")
            

            另一种可能性是编辑您的源文件...

            【讨论】:

              【解决方案12】:

              您还可以在 R 中使用 make 名称和 gsub 函数的组合。

              names(ctm2)<- gsub("\\.","_", make.names(names(ctm2), unique = T))
              

              以上代码一次会做两件事:

              1. 它将为所有列创建唯一名称 - 例如相同的名称将被转换为唯一的,例如c("ab","ab") 将被转换为 c("ab","ab2")
              2. 它将用下划线替换点。当您尝试选择带有下划线的列名而不是带有点的列名时,它变得容易(只需双击名称)。选择带点的列名非常困难。

              【讨论】:

                【解决方案13】:

                如果您使用 read.csv() 导入数据(将所有空格“”替换为“.”),您可以使用以下划线“_”替换这些数据:

                names(df) <- gsub("\\.", "_", names(df))
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2020-10-08
                  • 2022-10-12
                  • 2021-04-13
                  • 2021-06-15
                  • 2013-04-06
                  • 1970-01-01
                  • 2012-10-31
                  • 1970-01-01
                  相关资源
                  最近更新 更多