2017-06-20 117 views
0

我的目標是從變量列表創建大量時間序列子集。我用for循環寫了這個。然而,我正在尋找關於如何處理existir R函數的更優雅的想法,它不需要循環。我們非常感謝所有對R中新功能的想法和介紹。for循環的改進:創建一系列沒有循環的子集

代碼重複的例子:

russell_sim <- arima.sim(model=list(ar=c(.9,-.2)),n=449) 
russell_sim <- ts(russell_sim, start = c(1980,1), end = c(2017,5) ,frequency = 12) 

pmi_sim <- arima.sim(model=list(ar=c(.9,-.2)),n=449) 
pmi_sim <- ts(russell_sim, start = c(1980,1), end = c(2017,5) ,frequency = 12) 

big_list<- list(russell = russell_sim, pmi= pmi_sim) 

for (i in 1: length(big_list)) { 
    assign(paste(names(x = big_list)[i], "_before08", sep = ""), window(big_list[[i]], start=c(1981,1), end=c(2007, 12)) ) 
} 

謝謝。

回答

1

您可以使用得心應手list2env功能的,但是你需要先編輯列表,以獲得所需輸出:

# New List to edit 
big_list_before08 <- big_list 
# change your observations 
big_list_before08 <- lapply(big_list_before08, function(x) window(x, start = c(1981,1), 
                    end = c(2007,12))) 
# change the individual list element names 
names(big_list_before08) <- paste0(names(big_list),"_before08") 

# save to the global environment 
list2env(big_list_before08, envir = .GlobalEnv) 

讓我知道如果您有任何問題!

+0

謝謝,這個工程,它正是我一直在尋找。有一件事,爲什麼推薦使用lapply/list2env代替R中的循環?有什麼優勢?謝謝。 – k1000x

+1

好吧,除了性能外,代碼通常更清晰,lapply不會像for循環那樣將對象添加到您的環境中(例如迭代術語「i」),並且您知道輸出將以列表格式顯示。如果您正在迭代並重新分配相同的對象,或者使用許多不同的對象,則for循環更適合使用。有些人聲稱應用函數比循環更快,但這都是上下文的。我只是提供給你一個替代你當前的代碼,我發現自己在這裏和那裏使用'assign'或'get'函數:) –