2017-06-27 9 views
0

非常に大きなデータセット(40,000行以上)の場合、20行のグループで分位数を計算しようとしています。また、結果を1つの.csvファイルに書きたいと思います。大規模なデータフレームで20のグループで分位数を計算するR

私はこのようにスライス表記を使用して必要なものを計算することができる午前:

my_data<-read.csv(file.choose(),header=TRUE) 

    q1<-my_data[1:20,"Q"] 
    q2<-my_data[21:40,"Q"] 

    quant1<-quantile(q1,c(0.5,0.75,0.8,0.9,0.95)) 
    quant2<-quantile(q2,c(0.5,0.75,0.8,0.9,0.95)) 

    d=data.frame(quant1,quant2) 

    write.csv(d,file="q_values.csv") 

しかし、これは非常に面倒で時間のかかるデータセット全体のための再書き込み、これらの線になります。私は何とかデータを繰り返し、20行ごとに必要なものを計算するようにしたいと思っていますが、これを行う方法を理解できないようです。私はRの "for"ループのヘルプファイルを読んだことがありますが、これはコーディングに関してはまだ初心者レベルであり、これを行う方法に関するいくつかのガイダンスを高く評価します。ありがとうございます

答えて

2

インデックスを付ける列を追加すると、これをかなり簡単に行うことができます。以下は、data.tableを使用した例です。

結果を与える
dat <- data.table(Q = rnorm(40000)) 
dat[, R := rep(1:(.N/20), each = 20)] 
dat[, .(quant_0.5 = quantile(Q, probs = c(0.5)), 
     quant_0.75 = quantile(Q, probs = c(0.75)), 
     quant_0.8 = quantile(Q, probs = c(0.8)), 
     quant_0.9 = quantile(Q, probs = c(0.9)), 
     quant_0.95 = quantile(Q, probs = c(0.95))), 
    by = R] 

  R quant_0.5 quant_0.75 quant_0.8 quant_0.9 quant_0.95 
    1: 1 -0.123822327 0.4609870 0.5784939 1.0898441 1.1224632 
    2: 2 -0.251293742 0.3701377 0.7802016 1.0747215 1.5514140 
    3: 3 -0.070979910 0.4268033 0.5546480 1.4477840 1.5304469 
    4: 4 0.177552739 0.8687846 1.0001809 1.3883132 1.5394739 
    5: 5 0.515836825 0.9611607 1.1268148 1.3396512 1.5087827 
    ---                
1996: 1996 0.566311407 1.0667204 1.3171846 1.5641837 1.8594775 
1997: 1997 0.009336622 0.2859035 0.3397875 0.5472635 0.8108932 
1998: 1998 0.514867828 1.0330679 1.0534716 1.2528384 2.0933062 
1999: 1999 0.247092220 0.7501609 0.8924200 1.1446394 1.4736887 
2000: 2000 -0.076496868 0.6816951 0.7430764 0.8362260 1.1001702 
+0

はあなたにエリックをありがとう!以前はdata.tableについて聞いたことがなかったので、これは素晴らしい結果でした!私はまずデータフレームをas.data.tableを使ってデータテーブルに変換しなければならなかった。私はデータファイルに数ナノがあるのを気付かずに立ち往生してしまったので、スクリプトが動作する前にそれらに対処しなければなりませんでした。ありがとうございました! – student2017

+0

うれしい私は助けることができます。これを行うにはたくさんの方法がありますが、data.framesではなくdata.tableを使用することが多いので、data.tableをデフォルトにしています。特に、パッケージdplyrは、data.framesを使用して上記と同様の結果を得ますが、構文は非常に異なります。いずれにしても、列をインデックス化すると便利です。 data.tableが好きであれば、関数 'fread'を使って試してみてください。 'my_data < - fread(file.choose())' これはcsvで読み込まれます。多くの場合、read.csv willよりもずっと高速で、data.tableを一度に作成します。 –

関連する問題