导入文件后,我总是尝试从列名中删除空格,以便更轻松地引用列名。
除了使用转换然后删除此命令创建的额外列之外,还有更好的方法吗?
这是我现在使用的:
names(ctm2)
#tranform function does this, but requires some action
ctm2<-transform(ctm2,dymmyvar=1)
#remove dummy column
ctm2$dymmyvar <- NULL
names(ctm2)
为此目的,存在更优雅和通用的解决方案:
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)
有一个非常有用的包,称为janitor
它使清理列名非常简单。它删除所有唯一字符并将空格替换为_
.
library(janitor)
#can be done by simply
ctm2 <- clean_names(ctm2)
#or piping through `dplyr`
ctm2 <- ctm2 %>%
clean_names()
要仅替换每列中的第一个空格,您还可以执行以下操作:
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 不会在模式匹配的第一个实例处停止。
像这样分配名称。这效果最好。它将名称中的所有空格替换为下划线。
names(ctm2)<-gsub("\\s","_",names(ctm2))
到目前为止我发现的最佳解决方案是
names(ctm2) %<>% stringr::str_replace_all("\\s","_") %>% tolower
归功于评论者和其他答案
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
或者,您可以使用该stringr
软件包获得相同的结果。
names(ctm2) <- names(ctm2) %>% stringr::str_replace_all("\\s","_")
截至 2021 年 1 月:简洁且不使用额外库的 drplyr 解决方案是
df %<>% dplyr::rename_all(make.names)
信用归评论者所有。
在一段dplyr
代码中更改列的名称通常比在创建数据框后重命名列更方便。管道在rename_all()
这些情况下非常有用:
ctm2 %>% rename_all(function(x) gsub(" ", "_", x))
上面的代码将用下划线替换每个列名中的所有空格。
有一种简单的方法可以删除 data.table 中列名中的空格。您必须将数据框转换为数据表。
setnames(x=DT, old=names(DT), new=gsub(" ","",names(DT)))
Country Code
将转换为CountryCode
只需分配给names(ctm2)
:
names(ctm2) <- c("itsy", "bitsy", "eeny", "meeny")
或以数据驱动的方式:
names(ctm2) <- paste("myColumn", 1:ncol(ctm2), sep="")
另一种可能性是编辑您的源文件...
您还可以在 R 中使用 make 名称和 gsub 函数的组合。
names(ctm2)<- gsub("\\.","_", make.names(names(ctm2), unique = T))
上面的代码一次会做两件事:
如果您使用 read.csv() 导入数据(将所有空格“”替换为“.”),则可以使用下划线“_”替换这些数据:
names(df) <- gsub("\\.", "_", names(df))