段階的に分析およびソートする必要があるデータを含む大規模なデータセットがいくつかあります。以前、次のような関数を作成しました。
big.data.frame<-read.csv(data)
my.function<-function(big.data.frame){
for(i in 1:100) {
sort/analyze big.data.frame & store into a new data frame: my.df
if(i==1) iteration.result<-my.df
if(i>1) iteration.result<-rbind(my.df,iteration.result)
}
return(iteration.result)
}
私のデータでこの関数を実行するには、90 分かかります。その絶対に恐ろしい。そして、私の問題は、ここに書かれているように、地獄の 2 番目の円に閉じ込められていることです。
ここで、上記のリンクの @joran の推奨事項と R Inferno からコードを変更しました。
big.data.frame<-read.csv(data)
my.function<-function(big.data.frame){
my.list = vector(mode="list",100)
for(i in 1:100) {
sort/analyze big.data.frame & store into a new data frame: my.df
my.list[[i]]<-my.df
}
result <- do.call(rbind, my.list)
return(result)
}
しかし、これを実行するのにも 90 分かかりました。行のこの増分追加を回避することは役立つはずですが、そうではありません。
注 1: 100 の手順を実行する必要があります。
注 #2: 私のデータは、データ フレームに格納された未加工のデータ セットです。情報を抽出し、元のデータ フレーム全体を計算して改造する必要があります。したがって、各反復の新しいデータ フレーム (my.df と呼びます) は、元のデータ セットとはかなり異なって見えます。
注 #3: これは、summaryRprof() からのほとんどの出力です。
$by.total
total.time total.pct self.time self.pct
"my.function " 5010.42 100.00 0.14 0.00
"unlist" 4603.32 91.87 4593.42 91.68
"function1" 2751.96 54.92 0.04 0.00
"function2" 2081.26 41.54 0.02 0.00
"[" 229.72 4.58 0.08 0.00
"[.data.frame" 229.66 4.58 17.60 0.35
"match" 206.96 4.13 206.64 4.12
"%in%" 206.52 4.12 0.28 0.01
"aggregate" 182.76 3.65 0.00 0.00
"aggregate.data.frame" 182.74 3.65 0.04 0.00
"lapply" 177.86 3.55 35.84 0.72
"FUN" 177.82 3.55 68.06 1.36
"mean.default" 38.36 0.77 35.68 0.71
"unique" 31.90 0.64 4.74 0.09
"sapply" 26.34 0.53 0.02 0.00
"as.factor" 25.86 0.52 0.02 0.00
"factor" 25.84 0.52 0.24 0.00
"split" 25.22 0.50 0.10 0.00
"split.default" 25.12 0.50 2.60 0.05
"as.character" 19.30 0.39 19.26 0.38
"aggregate.default" 14.40 0.29 0.00 0.00
"simplify2array" 12.94 0.26 0.02 0.00
"eval" 5.94 0.12 0.10 0.00
"list" 5.16 0.10 5.16 0.10
"NextMethod" 4.04 0.08 4.04 0.08
"transform" 4.04 0.08 0.00 0.00
"transform.data.frame" 4.04 0.08 0.00 0.00
"==" 3.90 0.08 0.02 0.00
"Ops.factor" 3.88 0.08 0.92 0.02
"sort.list" 3.74 0.07 0.12 0.00
"[.factor" 3.62 0.07 0.00 0.00
"match.arg" 3.60 0.07 0.96 0.02
"ifelse" 3.34 0.07 0.66 0.01
"levels" 2.54 0.05 2.54 0.05
"noNA.levels" 2.52 0.05 0.00 0.00
"data.frame" 1.78 0.04 0.52 0.01
"is.numeric" 1.54 0.03 1.54 0.03
"deparse" 1.40 0.03 0.12 0.00
".deparseOpts" 1.28 0.03 0.02 0.00
"formals" 1.24 0.02 1.22 0.02
"as.data.frame" 1.24 0.02 0.00 0.00
注 #4: 物事を正しく解釈すると、関数 "unlist" に多くの時間がかかることがわかります。私の関数 my.function は実際には引数としてリストを取ります:
my.function<-function(data,...) {
dots<-list(...)
dots<-unlist(dots)
... etc
}