2012-05-04 7 views
40

私はquestion about this a few months backと尋ねましたが、私の答えは私の問題を解決したと思っていましたが、問題が再発して解決策がうまくいきませんでした。X. Rデータフレームのカラム名

私はCSVをインポートしています:

orders <- read.csv("<file_location>", sep=",", header=T, check.names = FALSE) 

は、ここでデータフレームの構造です:

str(orders) 

'data.frame': 3331575 obs. of 2 variables: 
$ OrderID : num -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ... 
$ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ... 

私は最初の列、受注にlengthコマンドを実行すると、私はこの取得:

length(orders$OrderID) 
[1] 0 

OrderDateでlengthを実行すると、c orrectly:

length(orders$OrderDate) 
[1] 3331575 

これはCSVheadのコピー/ペーストです。今

OrderID,OrderDate 
-2034590217,2011-10-14 
-2034590216,2011-10-14 
-2031892773,2011-10-24 
-2031892767,2011-10-21 
-2021008573,2011-12-08 
-2021008572,2011-12-07 
-2021008571,2011-12-07 
-2021008570,2011-12-07 
-2021008569,2011-12-07 

、私は場合read.csvを再実行しますが、check.namesオプションを取り出し、dataframeの最初の列は、今の名前の先頭にXを持っています。

orders2 <- read.csv("<file_location>", sep=",", header=T) 

str(orders2) 

'data.frame': 3331575 obs. of 2 variables: 
$ X.OrderID: num -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ... 
$ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ... 

length(orders$X.OrderID) 
[1] 3331575 

これは正しく機能します。

私の質問は、なぜRがXを最初の列名の先頭に追加するのですか? CSVファイルからわかるように、特殊文字はありません。それは単純な負荷でなければなりません。 check.namesを追加すると、CSVから名前をインポートすると、データが正しく読み込まれず、分析が実行されません。

これを解決するにはどうすればよいですか?

サイドノート:私はこれがマイナーであることを認識しています。私は正しくロードされていると思っていますが、期待した結果が得られていないと思っています。私はcolnames(orders)[1] <- "OrderID"を使用して列の名前を変更できますが、正しく読み込まれない理由を知りたいことがあります。

+0

次のアウトプットをカットアンドペーストできますか'head(orders)'と 'head(orders2)'のどちらか? –

+3

私は実際の生のcsvファイルを見るのがより興味があります。どこかに投稿してリンクを張ってダウンロードして、この動作を再現することができますか?問題が何であれ、私の推測はファイルの正確な構造と内容の答えです。 – joran

+0

私は注文のstrを取得していないが、その後、 'length(orders $ OrderID)[1] 0' –

答えて

54

read.csv()はより一般的なラッパですread.table()の機能です。後者の機能は、として文書化された引数check.namesがあります

check.names: logical. If ‘TRUE’ then the names of the variables in the 
     data frame are checked to ensure that they are syntactically 
     valid variable names. If necessary they are adjusted (by 
     ‘make.names’) so that they are, and also to ensure that there 
     are no duplicates. 

あなたのヘッダーはその後、構文的に有効でないラベルが含まれている場合make.names()は無効、削除、無効な名前に基づいて、有効な名前に置き換えます文字や可能性Xを付加:

R> make.names("$Foo") 
[1] "X.Foo" 

これは?make.namesで文書化されています

Details: 

    A syntactically valid name consists of letters, numbers and the 
    dot or underline characters and starts with a letter or the dot 
    not followed by a number. Names such as ‘".2way"’ are not valid, 
    and neither are the reserved words. 

    The definition of a _letter_ depends on the current locale, but 
    only ASCII digits are considered to be digits. 

    The character ‘"X"’ is prepended if necessary. All invalid 
    characters are translated to ‘"."’. A missing value is translated 
    to ‘"NA"’. Names which match R keywords have a dot appended to 
    them. Duplicated values are altered by ‘make.unique’. 

あなたが見ている行動は、あなたのデータでread.table()負荷を文書化する方法と完全に一致しています。これは、CSVファイルのヘッダ行に構文的に無効なラベルがあることを示唆しています。あなたのシステムのロケールによって、文字が何であるかという上記の点が?make.namesにあることに注意してください。 CSVファイルには、テキストエディタに表示される有効な文字が含まれていますが、Rが同じロケールで実行されていない場合、その文字はそこでは有効ではない可能性があります。

私はCSVファイルを見て、ヘッダ行にASCII以外の文字があればそれを特定します。おそらく見えない文字(またはエスケープシーケンス; \t?)もヘッダー行にあります。有効でない名前のファイルを読み込んでコンソールに表示すると、有効でない文字を隠す可能性がありますので、何も表示されないようにしてください。check.namesファイルがOKであることを示しています。

sessionInfo()の出力をポストすることも有用です。

+0

素敵な答えGavin +1ヘッダ名の前に 'make.names(" Foo ")'が '' X.Foo "'を作成するスペースがあるのだろうかと思います。 –

+0

私はそれを試みたようにスペースではありません[ここではcsvへのリンクです](http://dl.dropbox.com/u/61803503/TEST.csv)、ここにコードがあります: 'x < - " http: //dl.dropbox.com/u/61803503/TEST.csv "; (dat <-read.csv(url(x)、header = TRUE)) 'と' $ 'や'、 'doには影響しません。 –

+0

'X'の代わりに別の文字を使うことはできますか? – Dan

8

私はちょうどこの問題に遭遇し、それは単純な理由のためでした。私は数字で始まるラベルを持っていて、Rはそれらの前にXを追加していました。 Rはヘッダーの数字と混同され、値と区別するための文字を適用すると思います。

"3_in"は "X3_in"になりました... ラベルを "in_3"に切り替えて解決しましたが、問題は解決しました。

私はこれが誰かを助けてくれることを願っています。

+1

ありがとうございました。どのように体系的に "x"を削除しましたか?すべての列に「in_」を追加しますか? –

3

同様の問題が発生したため、次のコード行を共有して列名を修正したいと考えました。フォアハンドでのきれいなプログラミングは良いでしょうが、すばやく汚いアプローチとして誰かの出発点として役立つかもしれないので、完璧ではありません。 (私はRyanの質問/ Gavinの答えにそれらをコメントとして追加したいと思ったが、私の評判は十分ではないので、私は追加の回答を投稿しなければならなかった - 申し訳ありません)。

私のケースでは、データの書き込みと読み取りのいくつかのステップで、X列の内容とX.1の行番号を含む「X」、X.1 "、...という名前の1つ以上の列が生成されました。 。 - カラム。私の場合はX列の内容が行名と他のX.1として使用されるべき、...-列が削除されるべきである。

Correct_Colnames <- function(df) { 

delete.columns <- grep("(^X$)|(^X\\.)(\\d+)($)", colnames(df), perl=T) 

    if (length(delete.columns) > 0) { 

    row.names(df) <- as.character(df[, grep("^X$", colnames(df))]) 
    #other data types might apply than character or 
    #introduction of a new separate column might be suitable 

    df <- df[,-delete.columns] 

    colnames(df) <- gsub("^X", "", colnames(df)) 
    #X might be replaced by different characters, instead of being deleted 
    } 

    return(df) 
} 
0

Iは、以下を含むことにより、同様の問題を解決しwrite.csv関数の引数としてrow.names = FALSE write.csvは、CSVファイル内に名前のない列として行名を含めていましたが、read.csvはCSVファイルを読み込んだときにその列の名前を 'X'にしていました

関連する問題