2017-04-27 12 views
-1

PC上の1つのフォルダに保存した.csvファイルが多数あります。すると、次のように私は、論文データセットのリストを作成します。複数の.csvデータファイルを1つのデータフレームにマージする

> file_list <- list.files() 
> file_list 
[1] "ABWAbwut50.csv"  "ABWEinfam50.csv"  "ABWFeldwaldasph50.csv" "ABWGarage50.csv"  
[5] "ABWGemeindestr50.csv" "ABWHotel50.csv"  "ABWInd50.csv"   "ABWIntflaechen50.csv" 
[9] "ABWKantonsstr50.csv" "ABWMehrfam50.csv"  "ABWNutzwald50.csv"  "ABWSchutzwald50.csv" 
[13] "ABWstahlmitvieh50.csv" "ABWStromut50.csv"  "ABWWeideland50.csv" 

同じ列sontain .csvファイル、小数は.を使用し、カラムは;で区切られています。

for (file in file_list){ 
    if (!exists("dataset")){ 
    dataset <- read_delim(file, ";", escape_double = FALSE, trim_ws = TRUE) 
    } 
} 
dataset 

これらのデータセットを組み合わせようとしましたが、最初のファイルのみを読み込みます。 15個の.csvファイルをすべて1つのデータフレームにまとめるにはどうすればよいですか?私は何かが間違っていたとのいずれかのファイル(実際に私は、ファイル内の行の唯一のカップルを知っている)があるのみ7と仮定し

> View(dataset) 
> dataset <- do.call("rbind",lapply(file_list, 
+         FUN=function(files){read.table(files, 
+                 header=TRUE, sep=";")})) 
Show Traceback 

Rerun with Debug 
Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : 
    line 103 did not have 8 elements 

私は別のコードを実行したとき、私は、次のエラーメッセージが表示されました8の代わりに列を使用します。私は、いくつかの異常があるかどうかを調べるために、すべてのファイルを個別に検討したくありません。パターンに従わないこれらの線を自動的に削除するにはどうすればよいですか?ファイルの

> dput(dataset[1:10,]) 
structure(list(Berechnung = c("EconoMe original", "Berechnung 1", 
"Berechnung 2", "Berechnung 3", "Berechnung 4", "Berechnung 5", 
"Berechnung 6", "Berechnung 7", "Berechnung 8", "Berechnung 9" 
), Situation = c("Nach Massnahme Neue Gerinnefuehrung Gafenbach", 
"Nach Massnahme Neue Gerinnefuehrung Gafenbach", "Nach Massnahme Neue Gerinnefuehrung Gafenbach", 
"Nach Massnahme Neue Gerinnefuehrung Gafenbach", "Nach Massnahme Neue Gerinnefuehrung Gafenbach", 
"Nach Massnahme Neue Gerinnefuehrung Gafenbach", "Nach Massnahme Neue Gerinnefuehrung Gafenbach", 
"Nach Massnahme Neue Gerinnefuehrung Gafenbach", "Nach Massnahme Neue Gerinnefuehrung Gafenbach", 
"Nach Massnahme Neue Gerinnefuehrung Gafenbach"), NK = c(0, 0, 
0, 0, 0, 0, 0, 0, 0, 0), PID = c(2639L, 2639L, 2639L, 2639L, 
2639L, 2639L, 2639L, 2639L, 2639L, 2639L), Case = c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), Differenz = c(0, 0, 0, 0, 0, 0, 
0, 0, 0, 0), Prozess = c("Murgang", "Murgang", "Murgang", "Murgang", 
"Murgang", "Murgang", "Murgang", "Murgang", "Murgang", "Murgang" 
), Objektart = c("Abwasser unter Terrain", "Abwasser unter Terrain", 
"Abwasser unter Terrain", "Abwasser unter Terrain", "Abwasser unter Terrain", 
"Abwasser unter Terrain", "Abwasser unter Terrain", "Abwasser unter Terrain", 
"Abwasser unter Terrain", "Abwasser unter Terrain")), .Names = c("Berechnung", 
"Situation", "NK", "PID", "Case", "Differenz", "Prozess", "Objektart" 
), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame" 
+0

あなたは 'read.tableを、つまり'埋める= true'に引数を使用することができます(TRUE =記入し、ファイル、ヘッダ= TRUE、9月= ";") 'または一部が8に比べてわずか7列を持っている場合は、 data.table'から 'dplyr'または' rbindlist'の 'bind_rows'を使用してください。 – akrun

+0

@arkunありがとう、私は前にそれを試して、'未使用引数(fill = TRUE) 'を得ました。 – Danka

+0

[ http://stackoverflow.com/a/32888918/2204410)。 'data.table'の' dplyr'や 'rbindlist'の' bind_rows'を使う方が簡単です。 – Jaap

答えて

1

一つは、おそらくテキストで;含まれています

私のデータファイルは次のように見えます。このソリューションでは、最初のコーディング例を使用して、どのファイルに問題があるかを確認します。

file_list <- list.files() 
# setup the dataset 
dataset <- read.table(file_list[1], sep = ";", header = TRUE) 

# cycle through all other files 
for (file in file_list[-1]){ 
    temp <- try(read.table(file, sep = ";", header = TRUE)) 
    # check if the file can be read as a table 
    if(class(temp) == "try-error"){ 
     message(paste("One file skipped. Correct mistakes in file", file)) 
     print(temp) 
     next 
    } 
    dataset <- rbind(dataset, temp) 
} 
+0

が正しい場合に、エラーを示す小さな再現可能な例を投稿できますか?実際に記述の1つに ';'が含まれています。しかし、あなたは1つの変数だけでデータフレームを作成しました。私は、どのファイルを修正する必要があるかを示す多数のエラーメッセージを取得しました。ファイルに戻らなくても自動的にエラーを修正する方法はありますか? – Danka

+0

私は自分のファイルのすべての間違いを訂正しました。それは私が望んでいたものです。しかし、ジレンマはまだ残っています:私はすべての "汚染された"ファイルを個別に通過する必要はないので、ショートカットはありますか? – Danka

+0

「purrr:safely」を参照してください。 – FlorianGD

関連する問題