如何修复数据框列名中的空格(删除空格,插入点)?

73

导入文件后,我总是尝试删除列名中的空格,以便更轻松地引用列名。除了使用 transform,然后删除此命令创建的额外列,是否有更好的方法可供选择?

这是我现在使用的方法:

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

3
请使用inject.dots函数:inject.dots <- function(df) {names(df) <- sub(" ", ".", names(df));df}。该函数用于将数据框的列名中的空格替换为点“.”,并返回修改后的数据框。 - Tyler Rinker
2
说实话,我很惊讶R导入带有空格的列名并且不会自动修复。 - Tyler Rinker
8
read.table 函数默认使用 make.names 函数进行处理。 - IRTFM
3
是的,两者都支持check.names=T,默认是TRUE。 - smci
13个回答

85

有一个更优雅和通用的解决方案:

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)

8
优秀的解决方案。这里有一个整洁的替代方法: df %>% dplyr::rename_all(funs(make.names(.))) - avallecam
6
dplyr 0.8.0版本已将funs()标记为软弃用,现在的整洁替代方法是:df %>% dplyr::rename_all(list(~make.names(.)))。这个替代方法不会改变原意,且更容易理解。 - GISHuman
5
将数据框 df 中所有列的名称转换为合法的变量名格式。对于不符合变量名规则的字符,将被替换成.。这可以使用管道操作符%>%以及rename_all()函数来实现。 - nniloc
3
rename_all() is superseded in dplyr 1.0.7. so it would be better to use df %>% rename_with(make.names) - T. BruceLee

49

有一个非常实用的包叫做janitor,可以很简单地清理列名。它会删除所有唯一的字符并将空格替换为_

library(janitor)

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

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

39

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

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

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

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

或者,如第一个答案中提到的(虽然这种方法不能修复所有空格):

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

x是你的数据框名称。我喜欢使用“_”来避免在ID的一部分中出现“.”时引起问题。

重点是gsub不会停止在第一个模式匹配实例。


问题在于,至少在我的情况下,如果列名有多个空格,它只会替换第一个。 - AmagicalFishy

14

dplyr::select_all() 可以用来重新格式化列名。这个例子将空格和句号替换为下划线,并将所有内容转换为小写:

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

12

按照以下方式指定名称。这是最佳实践。它将名称中的所有空格替换为下划线。

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


1
迄今为止,最直接、最简洁的解决方案。 - GlennFriesen

11

迄今为止我找到的最佳解决方案是

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

感谢评论者和其他回答者


有没有一种方法可以将其整合到应用程序类型的函数中,以便在多个数据集中重命名列? - Addison

9

在使用dplyr代码创建数据框之前,更改列名通常比创建数据框后重命名列名更为方便。在这种情况下,使用管道中的rename_all()非常有用:

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

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


8

更新于2022年8月:

df %>% rename_with(make.names)

原代码如下:(虽然仍可使用)

截至2021年1月,使用drplyr的简洁解决方案,无需使用额外的库:

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

感谢评论者。


rename_all 已被 rename_with 取代,尽管该解决方案肯定可以直接使用。 - RayVelcoro

6

另外,您也可以使用 stringr 包来达到相同的结果。

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


3

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

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

国家代码将被转换为CountryCode


1
省略 old 将会得到相同的结果。(文档中有详细说明。) - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接