更改列名称的字母大小写

Mar*_*ler 12 r

我有大量的数据集,每个数据集都包含一长列列名.在某些文件中,列名称都是大写字母,在某些文件中,只有列名的第一个字母大写.我需要附加数据集,并认为在数据集之间匹配列名的最简单方法是将全资本名称转换为只有首字母大写的名称.

我希望找到一个通用的解决方案,甚至可能是一个单行.

这是我的示例数据集.所需的名称包含在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)


ika*_*sky 12

现代解决方案

这是现在的工作janitor::clean_names(),只需选择case适合您需要的参数。


小智 10

简单的解决方案

names(DF) <- toupper(names(DF))


Mat*_*her 8

一个“整洁”的解决方案:

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)


lin*_*abe 6

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)


Sve*_*enB 5

另外一个选择:

colnames(df) <- stringr::str_to_title(colnames(df))
Run Code Online (Sandbox Code Playgroud)