2016-05-06 16 views
0

私はdf、YearHT、6.5M x 55のカラムを持っています。抽出して追加する特定の情報がありますが、集計値にのみ基づいています。私はforループを使用して大きなdfをサブセット化し、計算を実行しています。サブセット化の代わりにR

私は、ループを避けるべきであると聞きましたが、私がこのクエリを実行するときに〜3時間かかるので、私が使ったforループを回避する方法があるのだろうかと思います。

srt=NULL 
for(i in doubletCounts$Var1){ 
    s=subset(YearHT,YearHT$berthlet==i) 
    e=unlist(c(strsplit(i,'\\|'),median(s$berthtime))) 
    srt=rbind(srt,e) 
} 
srt=data.frame(srt) 
s2=data.frame(srt$X2,srt$X1,srt$X3) 
colnames(s2)=colnames(srt) 
s=rbind(srt,s2) 

doubletCountsが700×3 DFであり、そしてそれぞれの値が大きいDF内に見出される:

はここに私のコードです。

私はこのプロセスを最適化/スピードアップするためのアイデアを聞いてうれしいです。

+3

コードをテストできるように、データセットの小さなサンプルを提供できますか? 'dput()'を使ってサンプルを得ることができます(最初の10行だけを選択してください) – Bas

+2

非常に大きなデータセットを扱っているので、 'data.table'を試してみませんか?データフレームよりもはるかに高速です。 –

答えて

2

ここではdata.tableを使用した高速ソリューションですが、ご質問からoutputを取得したいのですか?

# load library 
    library(datat.table) 

# convert your dataset into data.table 
    setDT(YearHT) 

# subset YearHT keeping values that are present in doubletCounts$Var1 
    YearHT_df <- YearHT[ berthlet %in% doubletCounts$Var1] 

# aggregate values 
    output <- YearHT_df[ , .(median= median(berthtime)) ] 
+0

私は間違いなくデータテーブルで作業することを忘れてはなりません。私はそれらを数回使ったが、いつもdfsに頼っている。 – alex

0

forループは必ずしも避けるべきものではありませんが、回避する必要のあるループは特定の方法で使用しています(for)。あなたは古典的なforループの大失敗をここにコミットしました。

srt = NULL 
for (i in index) 
{ 
    [stuff] 
    srt = rbind(srt, [stuff]) 
} 

は、あなたが srt = rbind(...)を打つたびに、あなたは何をする必要があります srtオブジェクトの種類とどのくらいのメモリに把握するためにあらゆる種類のものを行うためにRを求めているので、希望よりも遅くなるようにバインドされていますそれに割り当てます。あなたは、出力の長さはアップフロントにする必要があるか知っているとき、それは

srt <- vector("list", length = doubletCounts$Var1) 
for(i in doubletCounts$Var1){ 
    s=subset(YearHT,YearHT$berthlet==i) 
    srt[[i]] = unlist(c(strsplit(i,'\\|'),median(s$berthtime))) 
} 
srt=data.frame(srt) 

またはそれらの両方がほぼ同じ速度で実行する必要があります

srt = lapply(doubletCounts$Var1, 
     function(i) 
     { 
      s=subset(YearHT,YearHT$berthlet==i) 
      unlist(c(strsplit(i,'\\|'),median(s$berthtime))) 
     } 
) 

apply代替を行う方が良いでしょう

(注:データが不足しているため両方ともテストされていないため、少しバグがある可能性があります)

他にも、 e subset呼び出しを破棄してインデックスを使用します。あなたのforループの内容は

unlist(c(strsplit(i, '\\|'), 
     median(YearHT[YearHT$berthlet == i, "berthtime"]))) 

に煮詰めことができるが、私は救うことどのくらいの時間がわかりません。

関連する問題