大きなデータ フレームを取得し、値の各列をそれらの値の累積頻度 (昇順で並べ替え) で置き換えるプログラムを作成しようとしています。たとえば、値の列が 5、8、3、5、4、3、8、5、5、1 の場合、相対度数と累積度数は次のようになります。
- 1: rel_freq=0.1、cum_freq = 0.1
- 3: rel_freq=0.2、cum_freq = 0.3
- 4: rel_freq=0.1、cum_freq = 0.4
- 5: rel_freq=0.4、cum_freq = 0.8
- 8: rel_freq=0.2、cum_freq = 1.0
元の列は次のようになります: 0.8、1.0、0.3、0.8、0.4、0.3、1.0、0.8、0.8、0.1
次のコードはこの操作を正しく実行しますが、おそらくネストされたループが原因でスケーリングが不十分です。このタスクをより効率的に実行する方法はありますか?
mydata = read.table(.....)
totalcols = ncol(mydata)
totalrows = nrow(mydata)
for (i in 1:totalcols) {
freqtable = data.frame(table(mydata[,i])/totalrows) # create freq table
freqtable$CumSum = cumsum(freqtable$Freq) # calc cumulative freq
hashtable = new.env(hash=TRUE)
nrows = nrow(freqtable)
# store cum freq in hash
for (x in 1:nrows) {
dummy = toString(freqtable$Var1[x])
hashtable[[dummy]] = freqtable$CumSum[x]
}
# replace original data with cum freq
for (j in 1:totalrows) {
dummy = toString(mydata[j,i])
mydata[j,i] = hashtable[[dummy]]
}
}