web-dev-qa-db-ja.com

データセットをインポートする際の問題: `scan(...)のエラー:行1には145個の要素がありません`

read.table()を使用してRにデータセットをインポートしようとしています。

Dataset.df <- read.table("C:\\dataset.txt", header=TRUE)

しかし、次のエラーメッセージが表示されます。

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
   line 1 did not have 145 elements

これはどういう意味ですか、どうすれば修正できますか?

53
REnthusiast

このエラーは一目瞭然です。データファイルの最初の行(またはheader = TRUEを使用しているため、場合によっては2行目)にデータが欠落しているようです。

簡単な例を示します。

## Create a small dataset to play with
cat("V1 V2\nFirst 1 2\nSecond 2\nThird 3 8\n", file="test.txt")

Rは、行名と2列(3要素)が必要であることを自動的に検出しますが、2行目に3要素が見つからないため、エラーが発生します。

read.table("test.txt", header = TRUE)
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
#   line 2 did not have 3 elements

データファイルを見て、実際に問題があるかどうかを確認します。

cat(readLines("test.txt"), sep = "\n")
# V1 V2
# First 1 2
# Second 2
# Third 3 8

手動で修正する必要がある場合があります。または、「2番目」の行の最初の値が最初の列にあり、他の値がNAであると想定できます。この場合、fill = TRUEで問題を解決できます。

read.table("test.txt", header = TRUE, fill = TRUE)
#        V1 V2
# First   1  2
# Second  2 NA
# Third   3  8

Rは、行名が欠落している場合でも必要な要素の数を把握するのに十分スマートです。

cat("V1 V2\n1\n2 5\n3 8\n", file="test2.txt")
cat(readLines("test2.txt"), sep = "\n")
# V1 V2
# 1
# 2 5
# 3 8
read.table("test2.txt", header = TRUE)
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
#   line 1 did not have 2 elements
read.table("test2.txt", header = TRUE, fill = TRUE)
#   V1 V2
# 1  1 NA
# 2  2  5
# 3  3  8
68

このエラーが発生し、データが欠落していないように見えるデータセットを確認すると、いくつかのエントリにデータのインポートを妨げる特殊文字「#」が含まれていることがわかりました。問題のセルから「#」を削除すると、データは問題なくインポートされました。

23
Greg Kennedy

Add Healthデータから一部のファイルをRにインポートしているときにこの問題が発生しました( http://www.icpsr.umich.edu/icpsrweb/ICPSR/studies/21600?archive=ICPSR&q=21600を参照 )たとえば、タブ区切りの.tsv形式でDS12データファイルを読み取る次のコマンドは、次のエラーを生成します。

ds12 <- read.table("21600-0012-Data.tsv", sep="\t", comment.char="", 
quote = "\"", header=TRUE)

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, 
na.strings,  : line 2390 did not have 1851 elements

一部のファイルには、Rがファイルを拒否する原因となるわずかなフォーマットの問題があるようです。問題の少なくとも一部は、アポストロフィの代わりに二重引用符をときどき使用して、行内の二重引用符の文字数が不均一になることです。

いじった後、私は3つの可能な解決策を特定しました:

  1. テキストエディタでファイルを開き、引用文字「」のすべてのインスタンスを検索/置換します。つまり、二重引用符をすべて削除します。このタブ区切りデータでは、被験者からのコメントの一部の逐語的抜粋がデータ分析の問題ではなかった引用符でより長く。

  2. ICPSR(上記のリンクを参照)または他のアーカイブに保存されたデータを使用する場合、別の解決策はデータを新しい形式でダウンロードすることです。この場合の適切なオプションは、DS12のStataバージョンをダウンロードし、次のようにread.dtaコマンドを使用して開くことです。

    library(foreign)
    ds12 <- read.dta("21600-0012-Data.dta")
    
  3. 関連する解決策/ハックは、Excelで.tsvファイルを開き、タブ区切りテキストファイルとして再保存することです。これは、フォーマットの問題が原因でRが不幸になるものをすべてクリーンアップするようです。

これらのいずれも、元の.tsvファイルでRの問題を完全には解決しないという点で理想的ではありませんが、多くの場合、データラングリングには複数のプログラムと形式の使用が必要です。

6
Omar Wasow

Linuxを使用していて、データファイルがWindowsからのものである場合。おそらく文字^ Mがそれを見つけて削除するからでしょう。できた!

2
user1526449

ソリューションを見つけることができず、データに要素が欠落していないことを知っている他の人のために:

Excel 2013を使用してファイルを.csvとして保存し、read.table()を使用してRにロードしようとすると、この問題が発生します。私が見つけた回避策は、Excelから直接データを.txtドキュメントに貼り付けてから開きます:

read.table(file.choose(), sep="\t").

これがお役に立てば幸いです。

1
user2859829

上記のすべてのガイダンスに加えて、すべてのデータを確認することもできます。

単語の間に空白がある場合は、"_"で置き換える必要があります。

しかし、それは私自身の問題をどのように解決するかです。

0
Jack.yu

このエラーを作成するハッシュ#シンボル。列名の先頭から#を削除できる場合、問題を解決できる可能性があります。

基本的に、列名が行間で#で始まる場合、read.table()はその行の開始点として認識します。

0
SGV

Row.names = "id"( tutorial ごと)に "id"という名前の列がある場合、このエラーが発生しました。

0
QED