2012-11-06 26 views
5

カラム名の長いリストを含む多数のデータセットがあります。一部のファイルでは、列名はすべて大文字で、一部のファイルでは、列名の最初の文字のみが大文字になります。データセットを追加する必要があり、データセット間で列名を一致させる最も簡単な方法は、大文字の名前を最初の文字のみを大文字にした名前に変換することだと考えました。カラム名の大文字小文字を変更する

私は、一般的な解決策、おそらく1つのライナーを見つけることを望んでいます。

これは私のデータセットの例です。希望する名前は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%に対処するために1ライナーを見つけることができ、McCartneyBasinandRangeのような合併症に対処するために上記のnamesステートメントを使用すればそれはすばらしいでしょう。

解決策を見つけることなく、StackOverflowアーカイブを含むインターネットを検索しました。私は1つを見落とした場合は申し訳ありません。何か助けてくれてありがとう。ここで

+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

を私はジョシュ・オブライエンの答えを使用しますが、最終的に以下のコードを書きました最初の文字が大文字の の列名が作成され、その他の文字は小文字で作成されますが、いくつかの例外は元の投稿と同様に処理されます。私は、オリジナルのポストのように同じデータセットを使用しますが、n.colは、データファイル内の列数を判定するRにデータが異なっていることを読んで下:

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構文を、私はより多くの時間を節約するだろうと考えています効率的です。その1行の声明、さらに短い。

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 
関連する問題