用累积频率有效地替换数据帧

use*_*120 5 hash r vectorization cumulative-frequency dataframe

我正在尝试编写一个占用大数据帧的程序,并用这些值的累积频率(按升序排序)替换每列值.例如,如果值列为: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]]
    }
}
Run Code Online (Sandbox Code Playgroud)

rcs*_*rcs 2

这处理没有 -loop 的单个列for

R> x <- c(5, 8, 3, 5, 4, 3, 8, 5, 5, 1)
R> y <- cumsum(table(x)/length(x))
R> y[as.character(x)]
  5   8   3   5   4   3   8   5   5   1 
0.8 1.0 0.3 0.8 0.4 0.3 1.0 0.8 0.8 0.1 
Run Code Online (Sandbox Code Playgroud)