2015-12-18 7 views
0

Я новичок в R, и у меня есть следующий запрос. Я пытаюсь запустить цикл for. Прошло 20 минут, чтобы работать на 30 000 рядов. Я хочу запустить 4 миллиона строк. Я пробовал, и это занимает почти 3 дня. Есть ли способ минимизировать время, затрачиваемое на выполнение цикла.Время, затраченное на выполнение цикла

for(i in length(Data$CLAIM):1) 
{ 
    if(i==length(Data$CLAIM)) 
    { 
    Data$Net_Claim_Amt_Calc[i]=Data$INETCLMAMT[i] 
    Data$GOL_Calc[i]=Data$GOL[i] 
    Data$GLP_Calc[i]=Data$GLP[i] 
    Data$NOLCLM_Calc[i]=Data$NOLCLM[i] 
    Data$NLPCLM_Calc[i]=Data$NLPCLM[i] 
    } 
    else 
    { 
    if(Data$CLAIM[i]==Data$CLAIM[i+1]) 

    { 
     Data$Net_Claim_Amt_Calc[i]=sum(Data$INETCLMAMT[i],Data$Net_Claim_Amt_Calc[i+1]) 
     Data$GOL_Calc[i]=Data$GOL[i]+Data$GOL_Calc[i+1] 
     Data$GLP_Calc[i]=Data$GLP[i]+Data$GLP_Calc[i+1] 
     Data$NOLCLM_Calc[i]=Data$NOLCLM[i]+Data$NOLCLM_Calc[i+1] 
     Data$NLPCLM_Calc[i]=Data$NLPCLM[i]+Data$NLPCLM_Calc[i+1] 
    } 
    else 
    { 
     Data$Net_Claim_Amt_Calc[i]=Data$INETCLMAMT[i] 
     Data$GOL_Calc[i]=Data$GOL[i] 
     Data$GLP_Calc[i]=Data$GLP[i] 
     Data$NOLCLM_Calc[i]=Data$NOLCLM[i] 
     Data$NLPCLM_Calc[i]=Data$NLPCLM[i] 
    } 
    } 

} 
+0

вы уверены, что вы не можете векторизации? – astrosyam

+0

Это не похоже на использование цикла 'for'. (Цикл 'for' с итерациями 4e6 в значительной степени всегда является плохой идеей в R. Обычно существуют более быстрые (векторизованные) альтернативы.) – Roland

+0

Я никогда не использовал векторизованный ранее. можете ли вы посоветовать мне предоставить некоторые ссылки, связанные с векторизованным форматом? – Mayuri

ответ

0

Я не видел данных.

Вы можете попробовать следующее вместо сравнения элемента за элементом.

Например. данные (случайные величины),

Claim INETCLMAMT 
1 100   0 
2 100  100 
3 50   50 
4 45   21 
5 52   64 
6 52   56 
7  4   37 
8 38   6 
9 45   29 

Вместо сравнения каждого элемента в отдельности, можно применить сравнение на всю колонну. Например,

data$Claim == data$Claim 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

В вашем случае, вы сравниваете один элемент i th к i+1 элементу. Таким образом, мы можем создать новый столбец, который содержит значение i+1.

data$Claim_next = c(data$Claim[-1],0) 

data$Claim == data$Claim_next 
[1] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE 

Это возвращает TRUE для строк 1 и 5, так как следующие строки имеют одинаковые значения.

Теперь вы можете выполнить ваше сравнение,

if (data$Claim == data$Claim_next){ 
    Data$Net_Claim_Amt_Calc=Data$INETCLMAMT #replace with the actual code 
} 

Это if проверка присвоит значение INETCLMANT для Net_Claim_Amt_Calc если значение Claimi th такое же, как значение i+1.

Аналогичным образом назначение не обязательно должно выполняться по элементам.

Data$Net_Claim_Amt_Calc=Data$INETCLMAMT 

или

Data$Net_Claim_Amt_Calc = sum(some columns) 
+0

Я считаю, что переписывание кода, как указано выше, должно сделать трюк – astrosyam

+0

Проблема в том, что она не будет делать это во время выполнения. , например. если номер CLAIM в строке 9 и строке 10 такой же, то в строке он должен суммировать Net_Claim_Amt_Calc [10] и INETCLMANT [9]. Тем не менее, это потребует обновления Net_Claim_Amt_Calc [10] до обновления строки 9. Сообщите мне, если это имеет смысл. – Mayuri

0

Этот код может быть легко прорисовкой.

Простой набор данных для начала работы:

claims= sample(1:3, 10, replace=T) 

Используя функцию diff мы можем определить, где у нас есть последовательные значения

d = diff(claims) 
equals = which(d==0) 

Вы код теперь что-то вроде:

## Standard 
Data$Net_Claim_Amt_Calc[i]=Data$INETCLMAMT[i] 
Data$GOL_Calc[i]=Data$GOL[i] 
Data$GLP_Calc[i]=Data$GLP[i] 
Data$NOLCLM_Calc[i]=Data$NOLCLM[i] 
Data$NLPCLM_Calc[i]=Data$NLPCLM[i] 

Если значения равны

i = equals 
Data$Net_Claim_Amt_Calc[i]= sum(Data$INETCLMAMT[i],Data$Net_Claim_Amt_Calc[i+1]) 
Data$GOL_Calc[i]=Data$GOL[i]+Data$GOL_Calc[i+1] 
Data$GLP_Calc[i]=Data$GLP[i]+Data$GLP_Calc[i+1] 
Data$NOLCLM_Calc[i]=Data$NOLCLM[i]+Data$NOLCLM_Calc[i+1] 
Data$NLPCLM_Calc[i]=Data$NLPCLM[i]+Data$NLPCLM_Calc[i+1] 
Смежные вопросы