11

約 300 の個別の CSV を読み込む必要があります。ループと構造化された CSV 名を使用して、プロセスを自動化することができました。ただし、各 CSV には先頭に 14 ~ 17 行のごみがあり、ランダムに変化するため、read.table コマンドで「スキップ」パラメータをハードコーディングしても機能しません。各 CSV の列名と列数は同じです。

これが私が反対しているものの例です:

QUICK STATISTICS:

      Directory: Data,,,,
           File: Final_Comp_Zn_1
      Selection: SEL{Ox*1000+Doma=1201}
         Weight: None,,,
     ,,Variable: AG,,,

Total Number of Samples: 450212  Number of Selected Samples: 277


Statistics

VARIABLE,Min slice Y(m),Max slice Y(m),Count,Minimum,Maximum,Mean,Std.Dev.,Variance,Total Samples in Domain,Active Samples in Domain AG,  
6780.00,   6840.00,         7,    3.0000,   52.5000,   23.4143,   16.8507,  283.9469,        10,        10 AG,   
6840.00,   6900.00,         4,    4.0000,    5.5000,    4.9500,    0.5766,    0.3325,        13,        13 AG,   
6900.00,   6960.00,        16,    1.0000,   37.0000,    8.7625,    9.0047,   81.0848,        29,        29 AG,   
6960.00,   7020.00,        58,    3.0000,   73.5000,   10.6931,   11.9087,  141.8172,       132,       132 AG,   
7020.00,   7080.00,        23,    3.0000,  104.5000,   15.3435,   23.2233,  539.3207,        23,        23 AG,   
7080.00,   7140.00,        33,    1.0000,   15.4000,    3.8152,    2.8441,    8.0892,        35,        35 AG,

基本的には行から読みたいVARIABLE,Min slice Y(m),Max slice Y(m),...。いくつかの解決策を考えることができますが、どのようにプログラミングするかわかりません。とにかく私ができることはありますか:

  1. 最初に CSV を読み取り、何行のゴミがあるかをどうにかして調べてから、再度読み取り、スキップする正しい行数を指定しますか? または
  2. 列名が見つかったら読み取りread.tableを開始し (これらは各 CSV で同じであるため)、それより前のすべてを無視するように指示しますか?

解決策 (2) が最も適切だと思いますが、どんな提案もお待ちしております。

4

2 に答える 2

17

これは、取ることができる 1 つのアプローチの最小限の例です。

まず、説明したものと同様の csv ファイルをいくつか作成しましょう。

cat("blah\nblah\nblah\nVARIABLE,X1,X2\nA,1,2\n", file="myfile1.csv")
cat("blah\nVARIABLE,A1,A2\nA,1,2\n", file="myfile2.csv")
cat("blah\nblah\nVARIABLE,Z1,Z2\nA,1,2\n", file="myfile3.csv")

次に、データの開始点を特定します。

linesToSkip <- sapply(list.files(pattern = "myfile.*.csv"), 
                      function(x) grep("^VARIABLE", readLines(x))-1)

3 番目に、その情報を使用して、ファイルを 1 つのリストに読み込みます。

lapply(names(linesToSkip), 
       function(x) read.csv(file=x, skip = linesToSkip[x]))
# [[1]]
#   VARIABLE X1 X2
# 1        A  1  2
# 
# [[2]]
#   VARIABLE A1 A2
# 1        A  1  2
# 
# [[3]]
#   VARIABLE Z1 Z2
# 1        A  1  2

編集#1

データを 2 回読み取る代わりに、データを 1 回リストに読み取ってから、同じタイプの処理を実行します。

myRawData <- lapply(list.files(pattern = "myfile.*.csv"), readLines)
lapply(myRawData, function(x) {
  linesToSkip <- grep("^VARIABLE", x)-1
  read.csv(text = x, skip = linesToSkip)
})

または、さらに言えば:

lapply(list.files(pattern = "myfile.*.csv"), function(x) {
  temp <- readLines(x)
  linesToSkip <- grep("^VARIABLE", temp)-1
  read.csv(text = temp, skip = linesToSkip)
})

編集#2

@PaulHiemstraが指摘しているように、引数nを使用して、ファイル全体を読み取るのではなく、各ファイルの数行のみをメモリに読み取ることができます。したがって、各ファイルに 20 行以下の "ゴミ" があることが確実にわかっている場合、説明されている最初のアプローチを使用している場合は、次を使用できます。

linesToSkip <- sapply(list.files(pattern = "myfile.*.csv"), 
                      function(x) grep("^VARIABLE", readLines(x, n = 20))-1)
于 2013-03-11T06:26:26.950 に答える
9

freadパッケージdata.tableの関数は、スキップされる行数の自動検出を行います。この機能は現在開発段階にあります。

コード例は次のとおりです。

require(data.table)

cat("blah\nblah\nblah\nVARIABLE,X1,X2\nA,1,2\n", file="myfile1.csv")
cat("blah\nVARIABLE,A1,A2\nA,1,2\n", file="myfile2.csv")
cat("blah\nblah\nVARIABLE,Z1,Z2\nA,1,2\n", file="myfile3.csv")

lapply(list.files(pattern = "myfile.*.csv"), fread)
于 2013-03-11T07:52:06.520 に答える