如何在data.frame的列名中修复空格(删除空格,注入点)?

use*_*rJT 38 r dataframe

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

有没有更好的方法来执行此操作,然后使用transform然后删除此命令创建的额外列?

这就是我现在使用的:

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

小智 64

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

tidy.name.vector <- make.names(name.vector, unique=TRUE)
Run Code Online (Sandbox Code Playgroud)

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

此外,flag unique=TRUE允许您避免在新列名中使用可能的dublicates.

作为代码来实现

d<-read_delim(urltxt,delim='\t',)
names(d)<-make.names(names(d),unique = TRUE)
Run Code Online (Sandbox Code Playgroud)

  • 篦解决方案 这里有一个整洁的选择:`df%>%dplyr :: rename_all(funs(make.names(.))) (4认同)
  • funs() 从 `dplyr 0.8.0` 开始被软弃用,所以现在一个整洁的替代方案是:`df %&gt;% dplyr::rename_all(list(~make.names(.)))` (4认同)
  • `df %&gt;% rename_all(make.names)` (4认同)
  • `rename_all()` 在 `dplyr 1.0.7.` 中被取代,所以最好使用 `df %&gt;% rename_with(make.names)` (4认同)

joh*_*nes 23

要仅替换每列中的第一个空格,您还可以执行以下操作:

names(ctm2) <- sub(" ", ".", names(ctm2))
Run Code Online (Sandbox Code Playgroud)

或者替换所有空格(看起来它会更有用):

names(ctm2) <- gsub(" ", "_", names(ctm2))
Run Code Online (Sandbox Code Playgroud)

或者,如第一个答案中所述(虽然不能修复所有空格):

spaceless <- function(x) {colnames(x) <- gsub(" ", "_", colnames(x));x}
newDF <- spaceless(ctm2)
Run Code Online (Sandbox Code Playgroud)

其中x是data.frame的名称.我更喜欢用"_"来避免"."的问题.作为身份证的一部分.

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


cam*_*sia 14

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

library(janitor)

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

#or piping through `dplyr`
ctm2 <- ctm2 %>%
        clean_names()
Run Code Online (Sandbox Code Playgroud)


小智 9

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

ctm2 %>% rename_all(function(x) gsub(" ", "_", x))
Run Code Online (Sandbox Code Playgroud)

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


use*_*rJT 8

UDP日期 2022 年 8 月:

df %>% rename_with(make.names)
Run Code Online (Sandbox Code Playgroud)

截至 2021 年 1 月,旧代码是:(尽管仍然有效):简短且不使用额外库的 drplyr 解决方案是

df %<>% dplyr::rename_all(make.names)
Run Code Online (Sandbox Code Playgroud)

功劳归于评论者。


小智 7

像这样分配名称.这效果最好.它用下划线替换名称中的所有空格.

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


小智 6

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

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


use*_*rJT 5

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

names(ctm2) %<>% stringr::str_replace_all("\\s","_") %>% tolower
Run Code Online (Sandbox Code Playgroud)

归功于评论者和其他答案


sbh*_*bha 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
Run Code Online (Sandbox Code Playgroud)