2012-11-06 205 views
5

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

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

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

注意,包括我的名字McCartneyBasinandRange使事情变得更加现实,更加困难。但是,如果我可以找到一个单线来处理95%的名称,并使用上述names语句来处理诸如McCartneyBasinandRange之类的并发症,那将很不错。

我搜索了互联网,包括StackOverflow存档,没有找到解决方案。对不起,如果我忽略了一个。感谢您的任何帮助。

+3

它可能会更容易些,如果你转换所有的名称全部大写或全部小写使用'toupper'或'tolower',分别。将它们转换为混合大小写将会更困难。 –

回答

19

这里是一个班轮实现,我能想到的“相匹配的数据集之间的列名的最简单的方法”:

## 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

我用约什 - 奥布莱恩的答案,但最终写了下面的代码以大写形式创建第一个字母为 的列名,其他字母以小写形式创建,除少数例外情况在原始文章中处理外。下面我用同样的数据集在原岗位,但读取数据为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 
3

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 
相关问题