65

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

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

这是我现在使用的:

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

13 回答 13

78

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

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)
于 2014-08-06T06:26:17.637 回答
36

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

library(janitor)

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

#or piping through `dplyr`
ctm2 <- ctm2 %>%
        clean_names()
于 2018-11-30T14:37:09.933 回答
35

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

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 不会在模式匹配的第一个实例处停止。

于 2012-05-21T15:34:21.243 回答
11

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

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

于 2017-08-15T19:39:18.580 回答
9

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

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

归功于评论者和其他答案

于 2018-07-02T15:55:32.760 回答
9

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
于 2018-07-04T11:39:51.237 回答
4

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

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

于 2017-08-15T19:51:34.657 回答
4

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

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

信用归评论者所有。

于 2021-01-15T14:41:56.760 回答
4

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

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

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

于 2020-01-20T21:30:40.057 回答
3

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

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

Country Code将转换为CountryCode

于 2016-09-02T10:46:48.993 回答
2

只需分配给names(ctm2)

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

或以数据驱动的方式:

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

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

于 2012-05-21T15:30:32.873 回答
1

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

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

上面的代码一次会做两件事:

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

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

names(df) <- gsub("\\.", "_", names(df))
于 2020-03-12T00:21:26.567 回答