У меня есть следующий код, целью которого является взять один столбец с числовым столбцом данных и создать список st каждые два элемента вектора, ссылаясь на начальный и конечный индекс кадра данных где среднее значение составляет 0,032.Увеличение скорости векторной переменной переменной длины R
Пример:
Input: [0.012,0.02,0.032,0.045,0.026,0.06,0.01]
Output [3,5,6,6]
, как mean(input(3:5))>0.032
и mean(input(6:6))>0.032
Немного более сложный пример ввода [0,0.08,0.08,0.031,0.031, -0,1] Выход [2,5]
Поэтому я не могу просто идентифицировать элементы выше 0,032, и насколько я вижу, мне нужно перебирать каждый индекс. (отсюда цикл while)
Он работает очень хорошо для «небольших кадров данных», но я пытаюсь заставить его работать на кадры данных с 2 000 000 строк, если не больше.
Моя проблема в том, что он работает очень медленно, когда я встаю на большое количество строк. В частности, она стреляет через значения 0-100000, но резко замедляется после
activityduration<-function(input)
{
datum<-as.matrix(input)
len=length(datum)
times <-c()
i<-1
while (i <len)
{
if (i>=len)
{
break
}
i<-i+1
if (datum[i]<0.032)
{
next
}
else
{
vect = c(datum[i])
x<-i
while ((mean(vect)>=0.032)){
print(i)
if (i==len)
{
break
}
i<-i+1
boolean <- TRUE
vect <- c(datum[x:i])
}
if (i==len)
{
break
}
if (boolean)
{
times <- c(times, c(x,i-1))
boolean<-FALSE
}
}
}
return(times)
}
Что я предполагаю, что это вопрос: Я постоянно растущий вектор vect
внутри второго цикла While. (по некоторым моим данным vect
может достигать длины = 10000). Это означает, что я обновляю vect's
размер, повторяюще вызывающий замедление.
Исправления, которые я пробовал: Первоначально вход (кадр данных) был только что получен как кадр данных, я изменил его на матрицу для существенного увеличения скорости.
я заменил еще с:
{
newVal = c(datum[i])
x<-i
n<-0
meanValue<-0
while (((meanValue*n+newVal)>=(0.032*(n+1))){
print(i)
if (i==len)
{
break
}
meanValue<-(meanValue*n+newVal)/n+1
n<n+1
i<-i+1
}
который устранил необходимость вектора при сохранении той же операции, однако это вызывает еще большее замедляться. скорее всего, из-за большого количества выполненных операций.
Я также попытался: Инициирование вектора vect
с 700000 элементов, так что никогда не должен расти, но для того, чтобы сделать это мне нужно изменить:
mean(vect)>=0.032
к любому sum(vect)/n >=0.032
или mean(vect[!vect==0])
и этого результата в еще большем замедлении.
Кто-нибудь знает, как я могу увеличить скорость?
Какова цель? Можете ли вы предоставить образцы данных.(используйте 'dput (myDataFrame)' и ожидаемый результат? –
@RichardTelford добавил примеры внизу – user2962956
, возможно, тривиальный вопрос, но вы также попытались запустить код без 'print (i)'? Кроме того, возьмите посмотрите на пакет «microbenchmark». Он сконструирован специально для синхронизации функций. – Vandenman