2012-11-06 201 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 
相關問題