我有大量的数据集,每个数据集都包含一长列列名.在某些文件中,列名称都是大写字母,在某些文件中,只有列名的第一个字母大写.我需要附加数据集,并认为在数据集之间匹配列名的最简单方法是将全资本名称转换为只有首字母大写的名称.
我希望找到一个通用的解决方案,甚至可能是一个单行.
这是我的示例数据集.所需的名称包含在names
语句中.
my.data2 <- "
landuse units grade CLAY LINCOLN BASINANDRANGE MCCARTNEY MAPLE
apple acres AAA 0 2 3 4 6
apple acres AA 1000 900 NA NA 700
pear acres AA 10.0 20 NA 30.0 40
peach acres AAA 500 400 350 300 200
"
my.data2 <- read.table(textConnection(my.data2), header=TRUE)
names(my.data2)[names(my.data2)=="CLAY"] <- "Clay"
names(my.data2)[names(my.data2)=="BASINANDRANGE"] <- "BasinandRange"
names(my.data2)[names(my.data2)=="LINCOLN"] <- "Lincoln"
names(my.data2)[names(my.data2)=="MCCARTNEY"] <- "McCartney"
names(my.data2)[names(my.data2)=="MAPLE"] <- "Maple"
my.data2
Run Code Online (Sandbox Code Playgroud)
请注意,我包含了名称McCartney
,BasinandRange
使事情变得更加现实和困难.但是,如果我能找到一个单行代码来处理95%的名字,并使用上述names
陈述来处理类似的并发症McCartney
,BasinandRange
那将是很好的.
我搜索了互联网,包括StackOverflow档案,但没有找到解决方案.对不起,如果我忽略了一个.感谢您的任何帮助.
Jos*_*ien 27
这是一个单线程实现"数据集中匹配列名的最简单方法",我可以想到:
## Columns 1:3 left unaltered since they are not place names.
names(my.data2)[-1:-3] <- tolower(names(my.data2)[-1:-3])
## View the results
names(my.data2)
# [1] "landuse" "units" "grade" "clay"
# [5] "lincoln" "basinandrange" "mccartney" "maple"
Run Code Online (Sandbox Code Playgroud)
Wil*_*iam 18
结合这里的两个答案,我想出了一个优雅的tidy
方法:
这将通过大写每个单词的第一个字母来重命名所有列/变量名称。
library(tidyverse)
my.data2 %>%
rename_with(str_to_title)
Run Code Online (Sandbox Code Playgroud)
一个“整洁”的解决方案:
library(dplyr)
my.data2.mod <- my.data2 %>%
rename_at(c("CLAY", "LINCOLN", "BASINANDRANGE", "MCCARTNEY", "MAPLE"),
.funs = tolower)
names(my.data2.mod)
# [1] "landuse" "units" "grade" "clay"
# [5] "lincoln" "basinandrange" "mccartney" "maple"
Run Code Online (Sandbox Code Playgroud)
另外,要回答最初的问题并保留某些情况大写,您可以使用该snakecase
包:
library(snakecase)
my.data2.mod = my.data2 %>%
rename_at(
c("CLAY", "LINCOLN", "BASINANDRANGE", "MCCARTNEY", "MAPLE"),
.funs = list(
~ to_upper_camel_case(.,
abbreviations = c("McCartney", "BasinandRange")
)
)
)
names(my.data2.mod)
# [1] "landuse" "units" "grade" "Clay"
# [5] "Lincoln" "BasinandRange" "McCartney" "Maple"
Run Code Online (Sandbox Code Playgroud)
data.table语法,我相信会节省更多时间和效率。它也是单行语句,甚至更短。
setnames(my.data2, tolower(names(my.data2[4:8])))
# landuse units grade clay lincoln basinandrange mccartney maple
#1: apple acres AAA 0 2 3 4 6
#2: apple acres AA 1000 900 NA NA 700
#3: pear acres AA 10 20 NA 30 40
#4: peach acres AAA 500 400 350 300 200
Run Code Online (Sandbox Code Playgroud)
另外一个选择:
colnames(df) <- stringr::str_to_title(colnames(df))
Run Code Online (Sandbox Code Playgroud)