71

数か月前にこれについて質問したところ、答えで問題が解決したと思っていましたが、再び問題に遭遇し、解決策がうまくいきませんでした。

私は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最初の列 OrderID でコマンドを実行すると、次のようになります。

length(orders$OrderID)
[1] 0

OrderDate で実行するlengthと、正しく返されます。

length(orders$OrderDate)
[1] 3331575

これは の のコピー/貼り付けheadですCSV

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"が、正しく読み込まれない理由を知りたいです。

4

5 に答える 5

87

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。ファイルに問題がないことを示します。

の出力を投稿するsessionInfo()ことも役立ちます。

于 2012-05-04T07:43:07.467 に答える
12

私はちょうどこの問題に出くわしましたが、それは単純な理由によるものでした。番号で始まるラベルがあり、R はそれらすべての前に X を追加していました。Rはヘッダーの数字と混同されており、値と区別するために文字を適用していると思います.

というわけで、「3_in」が「X3_in」になったり… ラベルを「in_3」に切り替えたら解決しました。

これが誰かに役立つことを願っています。

于 2016-01-29T19:53:18.697 に答える