5

からいくつかのデータがあり、それをRにロードしようとしています。.csv ファイルで、Excel と OpenOffice の両方でデータを表示できます。(興味がある方は、ここで入手できる Elections Canada データからの 2011 年の世論調査結果データを参照してください)。

データは異常な方法でコード化されています。典型的な行は次のとおりです。

12002,Central Nova","Nova-Centre"," 1","River John",N,N,"",1,299,"Chisholm","","Matthew","Green Party","Parti Vert",N,N,11

"Central-Nova の最後にはがありますが、最初にはありません。したがって、データを読み取るために、引用符を抑制しました。これは、最初のいくつかのファイルではうまくいきました。すなわち。

test<-read.csv("pollresults_resultatsbureau11001.csv",header = TRUE,sep=",",fileEncoding="latin1",as.is=TRUE,quote="")

問題は次のとおりです。別のファイル (例: pollresults_resultatsbureau12002.csv) に、次のようなデータ行があります。

12002,Central Nova","Nova-Centre"," 6-1","Pictou, Subd. A",N,N,"",0,168,"Parker","","David K.","NDP-New Democratic Party","NPD-Nouveau Parti democratique",N,N,28

引用符を抑制する必要があるため、このエントリ"Pictou, Subd. A"により、Rはこれを 2 つの変数に分割する必要があります。データフレームの構築の途中で列を追加したいため、データを読み込むことができません。

Excel と OpenOffice はどちらもこれらのファイルを問題なく開くことができます。どういうわけか、Excel と OpenOfficeは、変数エントリの先頭にある場合にのみ引用符が重要であることを認識しています。

このデータを取得するためにRで有効にする必要があるオプションを知っていますか? ロードする必要があるファイルが 300 個を超えているため (それぞれに最大 1000 行あります)、手動で修正することはできません...

解決策をあちこち探しましたが、見つかりません。

4

2 に答える 2

1

私のコメントに基づいて、すべての CSV ファイルを 1 つのリストに読み込むソリューションを次に示します。

# Deal with French properly
options(encoding="latin1")

# Set your working directory to where you have
#   unzipped all of your 308 CSV files
setwd("path/to/unzipped/files")

# Get the file names
temp <- list.files()

# Extract the 5-digit code which we can use as names
Codes <- gsub("pollresults_resultatsbureau|.csv", "", temp)

# Read all the files into a single list named "pollResults"
pollResults <- lapply(seq_along(temp), function(x) {
  T0 <- readLines(temp[x])
  T0[-1] <- gsub('^(.{6})(.*)$', '\\1\\"\\2', T0[-1])
  final <- read.csv(text = T0, header = TRUE)
  final
})
names(pollResults) <- Codes

このリストは、さまざまな方法で簡単に操作できます。90 日だけを見たい場合は、または を使用して(つまり、インデックス番号または地区番号で)data.frameアクセスできます。pollResults[[90]]pollResults[["24058"]]

この形式のデータを持つことは、他にも多くの便利なことを実行できることを意味します。たとえば、308 個すべての CSV を一度に修正する場合は、次のコードを使用できます。これにより、ファイル名の先頭に「Corrected_」が付く新しい CSV が作成されます。

invisible(lapply(seq_along(pollResults), function(x) {
  NewFilename <- paste("Corrected", temp[x], sep = "_")
  write.csv(pollResults[[x]], file = NewFilename, 
            quote = TRUE, row.names = FALSE)
}))

お役に立てれば!

于 2013-02-26T16:09:51.323 に答える
1

この回答は主に@AnandaMahtoに対するものです(元の質問へのコメントを参照)。

まず、データにフランス語のアクセントがあるため、いくつかのオプションをグローバルに設定すると便利です。

options(encoding="latin1")

次に、以下を使用してデータを逐語的に読み取りますreadLines()

temp <- readLines("pollresults_resultatsbureau13001.csv")

これに続いて、データの各行の最初のコンマをコンマ + 引用符に置き換えるだけです。これは、最初のフィールドが常に 5 文字の長さであるため機能します。ヘッダーはそのままにしておくことに注意してください。

temp[-1] <- gsub('^(.{6})(.*)$', '\\1\\"\\2', temp[-1])

最後に、元のファイルを上書きします。

fileConn<-file("pollresults_resultatsbureau13001.csv") writeLines(temp,fileConn) close(fileConn)

最後に、単純にデータを R に読み込みます。

data<-read.csv(file="pollresults_resultatsbureau13001.csv",header = TRUE,sep=",")

これを行うためのもっと倹約的な方法 (そして、より簡単に繰り返すことができる方法) があるかもしれませんが、このプロセスは私には理にかなっています。

于 2013-02-26T14:44:35.203 に答える