7

私は困惑しています。通常はread.csv期待どおりに動作しますが、予期しない動作が発生するという問題が発生しました。私の側ではユーザーエラーである可能性が高いですが、助けていただければ幸いです。

これがファイルのURLです

http://nces.ed.gov/ipeds/datacenter/data/SFA0910.zip

これが、ファイルを取得して解凍し、それを読み取るための私のコードです。

 URL <- "http://nces.ed.gov/ipeds/datacenter/data/SFA0910.zip"
 download.file(URL, destfile="temp.zip")
 unzip("temp.zip")
 tmp <- read.table("sfa0910.csv", 
                   header=T, stringsAsFactors=F, sep=",", row.names=NULL)

これが私の問題です。Excelでデータcsvデータを開くと、データは期待どおりに表示されます。データをRに読み込むと、最初の列は実際にはrow.namesという名前になります。Rは余分な1行のデータを読み込んでいますが、row.namesが列になる原因となっている「エラー」がどこで発生しているかわかりません。単純に、データがシフトオーバーしたように見えます。

ただし、奇妙なことに、Rの最後の列に適切なデータが含まれているように見えます。

最初の数列の行は次のとおりです。

tmp[1:5,1:7]
  row.names UNITID XSCUGRAD SCUGRAD XSCUGFFN SCUGFFN XSCUGFFP
1    100654      R     4496       R     1044       R       23
2    100663      R    10646       R     1496       R       14
3    100690      R      380       R        5       R        1
4    100706      R     6119       R      774       R       13
5    100724      R     4638       R     1209       R       26

私が間違っている可能性があることについて何か考えはありますか?

4

4 に答える 4

17

ヒント:区切られたファイルが期待どおりに動作しない場合は、count.fields()をクイック診断として使用してください。

まず、 table()を使用してフィールドの数を数えます。

table(count.fields("sfa0910.csv", sep = ","))
# 451  452 
#   1 6852

これは、1行を除くすべての行に452個のフィールドが含まれていることを示しています。それで、異常な線はどれですか?

which(count.fields("sfa0910.csv", sep = ",") != 452)
# [1] 1

最初の行は問題です。検査では、最初の行を除くすべての行が2つのコンマで終了します。

今の問題は、それはどういう意味ですか?省略されたヘッダー行に余分なフィールドがあるはずですか?または、誤って他の行に2つのコンマが追加されましたか?あいまいさを明確にするために、可能であれば、データを生成した人に連絡するのが最善かもしれません。

于 2012-08-16T02:08:57.380 に答える
5

おそらくmnelのコメントに基づいて修正があります

dat<-readLines(paste("sfa", '0910', ".csv", sep=""))
ncommas<-sapply(seq_along(dat),function(x){sum(attributes(gregexpr(',',dat[x])[[1]])$match.length)})
> head(ncommas)
[1] 450 451 451 451 451 451

最初の列の後のすべての列には、Excelが無視する追加の区切り文字があります。

for(i in seq_along(dat)[-1]){
dat[i]<-gsub('(.*),','\\1',dat[i])
}
write(dat,'temp.csv')

tmp<-read.table('temp.csv',header=T, stringsAsFactors=F, sep=",")

> tmp[1:5,1:7]
  UNITID XSCUGRAD SCUGRAD XSCUGFFN SCUGFFN XSCUGFFP SCUGFFP
1 100654        R    4496        R    1044        R      23
2 100663        R   10646        R    1496        R      14
3 100690        R     380        R       5        R       1
4 100706        R    6119        R     774        R      13
5 100724        R    4638        R    1209        R      26

物語の教訓....ジョシュア・ウルリッヒに耳を傾ける;)

クイックフィックス。ファイルをExcelで開き、保存します。これにより、余分なセパレータも削除されます。

あるいは

dat<-readLines(paste("sfa", '0910', ".csv", sep=""),n=1)
dum.names<-unlist(strsplit(dat,','))
tmp <- read.table(paste("sfa", '0910', ".csv", sep=""), 
                   header=F, stringsAsFactors=F,col.names=c(dum.names,'XXXX'),sep=",",skip=1)
tmp1<-tmp[,-dim(tmp)[2]]
于 2012-08-16T01:32:24.387 に答える
2

私はあなたが答えを見つけたことを知っていますが、あなたの答えが私がこれを見つけるのを助けたので、私は共有します:

次のように、行ごとに列数が異なるファイルをRに読み込んだ場合:

1,2,3,4,5
1,2,3,4
1,2,3

次のように、欠落している列をNAで埋めて読み込まれます。

1,2,3,4,5
1,2,3,4,NA
1,2,3,NA,NA

しかし! 次のように、最大​​の列を持つ行が最初の行ではない場合:

1,2,3,4
1,2,3,4,5
1,2,3

それからそれは少し紛らわしい方法で読まれるでしょう:

1,2,3,4
1,2,3,4
5,NA,NA,NA
1,2,3,NA

(問題を理解する前は圧倒され、その後は非常に簡単です!)

それが誰かを助けるかもしれないことを願っています!

于 2017-04-16T17:57:52.437 に答える
-1

ローカルデータを使用している場合は、それが適切な場所にあることも確認してください。たとえば、作業ディレクトリに配置 setwd("C:/[User]/[MyFolder]") し、Rコンソールで直接変更してください。

于 2021-06-28T14:26:16.893 に答える