2014-02-11 2 views
2

В настоящее время я с 500,000 наблюдений данных, и у меня это шаг в моем R кода, который выполняет следующие функции -Альтернатива для дорогой для и если еще петли

attach(ds) 
weight <- rep(NA,length(date)) 
sales_base <- rep(NA,length(date)) 
cumsales <- rep(NA,length(date))  

weight[dup_no!=0 & month(date)==7] = lag_sales[dup_no!=0 & month(date)==7] 
sales_base[dup_no!=0 & month(date)==7] = cumsales[dup_no!=0 & month(date)==7] 
cumsales [dup_no!=0 & month(date)==7] = 1+ disc[dup_no!=0 & month(date)==7] 

for(i in 2:length(permno)) 
{ 
    if(dup_no[i]!=0 & month(date[i])!=6 & !is.na(lag_sales[i]) & (lag_sales[i])>0) 
    { 
    cumsales[i] = cumsales[i-1]*(1+disc[i])  
    weight[i] = cumsales[i]*sales_base[i-1] 
    } 
if(dup_no[i]!=0 & month(date[i])!=6 & (lag_sales[i])<=0) 
    { 
    cumsales[i] = cumsales[i-1]*(1+disc[i]) 
    weight_port[i] = NA 
    } 
} 

(формулы не может иметь смысл, как Я не показал вам весь код.) Первые три строки создают 3 столбца со значением 0. Следующие три строки заполняют значения ячеек в столбцах при условии выполнения набора условий. Следующий цикл for пытается заполнить оставшиеся пустые значения столбцов, вычисляя новые значения на основе предыдущих заполненных значений ячеек (полученных из строк 5, 6, 7).

Цикл for здесь занимает много времени из-за данных, и мне нужно оптимизировать этот код, поскольку он будет работать на гораздо больших данных. Есть ли альтернатива, которая может использоваться вместо этого для цикла?

Заранее благодарен!

+0

R является копией при изменении (структуры), это звучит так, будто вы можете быть экспоненциально растущими объектами. Если вам нужно использовать для циклов, убедитесь, что размер памяти был предварительно выделен всякий раз, когда вы можете. Проверьте [R Inferno] (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf), второе кольцо может иметь отношение к вам. –

ответ

2

Петли, как правило, очень трудоемки в R. Лучше избегать их, когда это возможно. Если вы ищете «векторизация», вы найдете множество потоков и руководств по обсуждению темы.

Просто краткий пример с кодом:

index <- dup_no!=0 & month(date)!=6 & !is.na(lag_sales) & (lag_sales)>0 
cumsales[index] <- cumsales[which(index)-1]*(1+disc[index]) 
weight[index] <- cumsales[index]*sales_base[which(index)-1] 

Это должно быть в состоянии заменить первую часть вашего для петли.

+0

Вау! Это кажется довольно прямым! Большое спасибо! – RHelp

Смежные вопросы