2015-10-21 70 views
0

我有一個循環應該運行大約300,000次,但當我將數據綁定到數據框時,它結束於55,我不知道發生了什麼。For Loop早期結束 - 爲什麼?

迴路中的問題是:

TrendlineMeta <- data.frame("FutureRecord" = character(), "System" = numeric(), "Intercepts" = numeric(), "Slopes" = numeric(), stringsAsFactors = FALSE) 

for (i in unique(TrendingData$FutureRecord)){ 
    FilteredList <- TrendingData[TrendingData$FutureRecord == i,] 

    Regressed <- lm(FilteredList$Value ~ FilteredList$Time)#, na.action = na.omit) 

    newrow <- c("FutureRecord"=j, "System"=max(as.character(FilteredList$System)), "Intercepts"=summary(Regressed)$coefficients[1,1], "Slopes"=summary(Regressed)$coefficients[2,1]) 
    TrendlineMeta <- rbind(TrendlineMeta, data.frame(as.list(newrow), stringsAsFactors = FALSE)) 
} 

和後55個itterations結束。

然而,這個循環:

TrendlineMeta <- data.frame("FutureRecord" = character(), "System" = numeric(), "Intercepts" = numeric(), "Slopes" = numeric(), stringsAsFactors = FALSE) 

for (i in unique(TrendingData$FutureRecord)){ 
    FilteredList <- TrendingData[TrendingData$FutureRecord == i,] 

    Regressed <- lm(FilteredList$Value ~ FilteredList$Time)#, na.action = na.omit) 

    #newrow <- c("FutureRecord"=j, "System"=max(as.character(FilteredList$System)), "Intercepts"=summary(Regressed)$coefficients[1,1], "Slopes"=summary(Regressed)$coefficients[2,1]) 
    #TrendlineMeta <- rbind(TrendlineMeta, data.frame(as.list(newrow), stringsAsFactors = FALSE)) 
} 

完成罰款。

這是怎麼回事我做錯了?我是R新手,所以沒有什麼會跳出來對我。

+1

不要在循環中生長對象。爲了您的任務,您可以輕鬆使用分割應用合併功能之一。 – Roland

+0

「FutureRecord」中的j = j代表之前在代碼中定義的靜態對象嗎? – Sebastian

+0

@塞巴斯蒂安,那應該是「FutureRecord」=我不是j。我曾嘗試在循環中執行「j < - i」,以查看是否以某種方式直接引用了我正在搞的東西。 @羅蘭,我可以研究一下,但是會在一個循環中增長一個對象,導致它過早結束? – hcaelxxam

回答

0

所以,這只是針對您的問題,但是在沒有看到底層數據集的情況下有點困難。我使用的是Hadley的purrrtidyr,plyrdplyr包。

它可以完成你正在嘗試做的事情而不使用循環。

partA <- TrendingData %>% 
    split(.$FutureRecord) %>% 
    map(~ lm(Value ~ Time, data = .)) %>% 
    map(summary) %>% 
    map("coefficients") %>% 
    map(data.frame) %>% 
    map(~ select(.x, Estimate) %>% 
     mutate(coef = row.names(.))) %>% 
    ldply(rbind) %>% 
    rename(FutureRecord = .id) %>% 
    spread(coef, Estimate) 

從這裏,

partB <- TrendingData %>% 
    select(FutureRecord, System) %>% 
    group_by(FutureRecord) %>% 
    filter(System == max(System)) %>% 
    ungroup 

然後,

left_join(partA, partB) 

運作的?