Примените пользовательскую функцию процентиля в скользящих строках над фреймом данных без цикла - R - PullRequest
1 голос
/ 04 июня 2019

У меня есть датафрейм с 10k строк и 150 столбцов.Я хочу применить скользящую пользовательскую функцию для вычисления ранга процентиля, используя простую функцию ранга процентиля (function(x, xo) sum(x <= xo,na.rm = T)/sum(!is.na(x))), где x - это кадр данных с числовыми значениями, а xo - значение, на котором я хочу вычислить ранг.Проблема в том, что я в настоящее время использую цикл и занимает огромное количество времени.Причина, по которой я использую цикл, заключается в том, что функция применяется к динамически изменяющемуся числу строк в кадре данных.Есть ли способ избежать цикла и сэкономить время?Этот процесс занимает около 71 секунды, и мне нужно запустить его для 250 различных наборов данных (всего около 5 часов).

Я пытался использовать функции применения, но безрезультатно.

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) и подмножеством, основанным на этом, но безуспешно.

...