2016-07-08 6 views
0

Я пытаюсь создать списки в R. Но я застрял. Вот мой R-код.Создание списка в цикле for в R

modellist_nnet <- list() 
window_lengths <- c(50, 100) 
for(i in 1:ncol(dep_var_normalized)) { 
for (j in window_lengths){ 

knnGrid <- expand.grid(k = c(1, 2, 5, 10, 20)) 

timecontrol <- trainControl(method = 'timeslice', initialWindow = j, horizon = 1, summaryFunction=absretSummary, selectionFunction = "best", 
          returnResamp = 'final', fixedWindow = TRUE, savePredictions = 'final') 
cl <- makeCluster(4) 
registerDoParallel(cl) 
set.seed(503) 
variable_merge <- merge(dep_var_normalized[,i], indep_var_selected[[i]], all=F) 
variable_merge <- as.data.frame(variable_merge) 
modellist_nnet[[i]]<- train(variable_merge[,-1], variable_merge[,1], method = "knn", 
          trControl = timecontrol, tuneGrid = knnGrid, preProcess = c('center', 'scale')) 
stopCluster(cl) 
cat("Window: ", j, "dep_var:", i) 
} 
} 

Я хочу создать список («modellist_nnet»), который содержит результаты обучения. результат только что имеет длину окна 100 («j») для каждого «i» Существует ли какой-либо возможный способ создания списков, имеющих как длину окна («j») (50, 100) для каждого «i «?

ответ

0

Вы можете создать список с одним элементом на i in dep_var_normalized, где каждый элемент - это другой список, который содержит 2 элемента, соответствующие каждому из j in window_lengths. В коде:

modellist_nnet <- list() 
# New empty list 
final_list <- list() 
window_lengths <- c(50, 100) 
for(i in 1:ncol(dep_var_normalized)) { 
for (j in 1:length(window_lengths)){ 

knnGrid <- expand.grid(k = c(1, 2, 5, 10, 20)) 

timecontrol <- trainControl(method = 'timeslice', initialWindow = window_lengths[j], horizon = 1, summaryFunction=absretSummary, selectionFunction = "best", 
          returnResamp = 'final', fixedWindow = TRUE, savePredictions = 'final') 
cl <- makeCluster(4) 
registerDoParallel(cl) 
set.seed(503) 
variable_merge <- merge(dep_var_normalized[,i], indep_var_selected[[i]], all=F) 
variable_merge <- as.data.frame(variable_merge) 
# Here the index changes to "j" 
modellist_nnet[[j]]<- train(variable_merge[,-1], variable_merge[,1], method = "knn", 
          trControl = timecontrol, tuneGrid = knnGrid, preProcess = c('center', 'scale')) 
stopCluster(cl) 
cat("Window: ", j, "dep_var:", i) 
} 
final_list[i] <-modellist_nnet 
} 

Если вы хотите получить доступ все модели, соответствующие window_length = 50, вы можете использовать lapply:

model_window_50 <- lapply(final_list, function(x) x[[1]]) 

Аналогично для window_length_100:

model_window_100 <- lapply(final_list, function(x) x[[2]]) 
+0

Никакая проблема !! :) – thepule

+0

У меня возникла проблема ... «modellist_nnet [[j]]» выводит результаты в modellist_nnet [[50]], modellist_nnet [[100]]. И содержит дополнительные списки, такие как modellist_nnet [[1]], modellist_nnet [[2]] .. которые имеют не значения ... Как я могу исправить эту проблему? ... –

+0

Ухмм, вы изменили второй цикл (по j) как я это сделал в своем ответе, или вы сохранили свою оригинальную версию? Кажется, что-то связано с тем, как определяется j. (Обратите внимание, что я также соответствующим образом изменил определение параметра * initialWindow *). – thepule

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