我有一个具有1万行和150列的数据框。我想应用滚动自定义函数来使用简单的百分等级函数(function(x, xo) sum(x <= xo,na.rm = T)/sum(!is.na(x))
)计算百分等级,其中x是数值的数据框,而xo是要在其上计算等级的值。问题是我当前正在使用一个循环,并且花费了大量时间。我使用循环的原因是该函数应用于动态更改数据帧的行数。有没有办法避免循环并节省一些时间?这个过程大约需要71秒,我需要针对250个不同的数据集运行它(总共大约5个小时)。
我尝试使用Apply函数,但没有结果。
ptm <- proc.time()
function(x, xo) sum(x <= xo,na.rm = T)/sum(!is.na(x))
df <- as.data.frame(matrix(data= runif(1:1000),nrow = 10000,ncol=150))
df2 <- as.data.frame(matrix(data= runif(1:1000),nrow = 10000,ncol=1))
df[,1:150] <- runif(1:10000)
colnames(df) <- c("Value_to_Rank","Percent.Range1","Percent.Range2","Percent.Range3") # named only 4 columns
for (i in c(1:nrow(BetaTotal))){
df2[i,1] <- perc.rank(df[1:i,3:150],df[i,2])
}
proc.time() - ptm
user system elapsed
71.46 0.23 72.67
任何效率都值得赞赏!我尝试添加带有“ rollwindow”元素(在本例中为i)和基于该元素的子集的另一列,但未成功。