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

时间:2012-05-21 15:28:14

标签: 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)

13 个答案:

答案 0 :(得分:61)

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

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)

答案 1 :(得分:20)

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

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的名称。我更喜欢用“_”来避免“。”的问题。作为身份证的一部分。

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

答案 2 :(得分:8)

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

library(janitor)

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

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

答案 3 :(得分:6)

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

object.method(parameter).method(parameter)...

答案 4 :(得分:4)

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

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

贷记评论者和其他答案

答案 5 :(得分:3)

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 :(得分:3)

在一个dplyr代码块中更改列名通常比在创建数据框后重命名列更方便。在以下情况下,使用rename_all()进行管道连接非常有用:

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

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

答案 7 :(得分:1)

只需分配到names(ctm2)

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

或以数据驱动的方式:

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

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

答案 8 :(得分:1)

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

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

Country Code将转换为CountryCode

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

您还可以在R中结合使用品牌名称和gsub函数。

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

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

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

答案 11 :(得分:0)

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

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

感谢评论者。

答案 12 :(得分:-1)

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

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