R 更改列名的字母大小写

R 更改列名的字母大小写,r,R,我有大量的数据集,每个数据集都包含一长串的列名。在某些文件中,列名都是大写字母,而在某些文件中,只有列名的第一个字母大写。我需要附加数据集,并且认为在数据集之间匹配列名的最简单方法是将所有大写名称转换为仅首字母大写的名称 我希望找到一个通用的解决方案,甚至可能是一条直线 这是我的示例数据集。所需名称包含在名称语句中 my.data2 <- " landuse units grade CLAY LINCOLN BASINANDRANGE MCCARTNEY MAPLE appl

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

我希望找到一个通用的解决方案,甚至可能是一条直线

这是我的示例数据集。所需名称包含在
名称
语句中

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

my.data2下面是一个单行程序,它实现了我能想到的“在数据集之间匹配列名的最简单方法”:

## 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"   
###列1:3保持不变,因为它们不是地名。

名称(my.data2)[-1:-3]我使用了Josh O'Brien的答案,但最终编写了下面的代码,用第一个字母创建列名 大写字母,其他字母小写,少数例外情况按原稿处理。下面我使用了与原始帖子中相同的数据集,但将数据读入R的方式不同,其中
n.col
决定了数据文件中的列数:

n.col <- as.numeric(length(scan("c:/users/mark w miller/simple R programs/names_with_capital_letters.txt", 
         what="character", nlines=1)))

my.data2 <- read.table(file = "c:/users/mark w miller/simple R programs/names_with_capital_letters.txt", 
            na.string=NA, header = T, colClasses = c('character', 'character', 'character', 
            rep('numeric', (n.col[1] - 3))))

first.letter  <- substring(names(my.data2)[-1:-3], 1, 1)
other.letters <- tolower(substring(names(my.data2)[-1:-3], 2))
newnames      <- paste(first.letter, other.letters, sep="")

names(my.data2)[-1:-3] <- newnames
names(my.data2)[names(my.data2)=="Basinandrange"]   <- "BasinandRange"
names(my.data2)[names(my.data2)=="Mccartney"]       <- "McCartney"

my.data2

#   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

n.coldata.table语法,我相信会节省更多的时间和效率。它也是一行语句,甚至更短

library(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
现代解决方案 现在这是
看门人::clean_names()
的工作,只需选择适合您需要的
大小写
参数即可

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

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"   
容易解决

names(DF)另一个选项:

colnames(df) <- stringr::str_to_title(colnames(df))

colnames(df)结合这里的两个答案,我想出了一个优雅的
整洁的方法:

这将通过大写每个单词的第一个字母来重命名所有列/变量名

library(tidyverse)
my.data2 %>%
  rename_with(str_to_title)

如果分别使用
toupper
tolower
将所有名称转换为全大写或全小写,可能会更容易。将它们转换为混合大小写会更难。你知道如何将小写标签分配回变量吗,例如
tolower(Hmisc::label(df))
将标签转换为小写,但我不确定如何将它们分配回数据集?弄明白了,这可能会对某人有所帮助,
a我尝试了清除名称,但它会在我的列名中插入下划线。其他人也报告了这一点,但只针对非标准字符。就我而言,它们大多是标准字母。例如,转换SPMu_xyz会为列名中其他地方存在下划线的所有实例生成sp_mu_xyz。
library(tidyverse)
my.data2 %>%
  rename_with(str_to_title)