22

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

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

これが私のサンプルデータセットです。必要な名前が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

名前を含めて、物事をより現実的でより困難にすることに注意してMcCartneyくださいBasinandRange。ただし、名前の95%を処理するワンライナーを見つけて、上記のnamesステートメントを使用して、のような複雑な問題を処理できるMcCartneyBasinandRangeしたら、それは素晴らしいことです。

解決策を見つけることなく、StackOverflowアーカイブを含むインターネットを検索しました。見落としたらごめんなさい。助けてくれてありがとう。

4

9 に答える 9

39

これは、私が考えることができる「データセット間で列名を一致させる最も簡単な方法」を実装するワンライナーです。

## 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"   
于 2012-11-06T19:41:22.030 に答える
2

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
于 2012-11-11T19:51:47.077 に答える