2013-11-28 5 views
1

Я изучал немного lapply магии в R, но не понял, как заменить вложенные циклы - это тоже возможно?Использование lapply для вложенных петель

Вот моя проблема и решение вложенной петли.

monCode <- c('F', 'G', 'H', 'J', 'K', 'M', 'N', 
     'Q', 'U', 'V', 'X', 'Z') 
yearRange <- as.character(3:15) 
yearRange[as.numeric(yearRange) < 10] <- as.character(paste0("0", yearRange[as.numeric(yearRange) < 10])) 

outList <- vector() 
for(Yr in yearRange) { 
    for (mon in monCode) { 
     outList <- c(outList, (paste0("IB", mon, Yr, " Comdty"))) 
    } 
} 

Как бы я сделать это с помощью вложенных lapply функции, а не вложенных циклов?

заранее спасибо

ответ

4

Нет необходимости для вложенных циклов или вложенных lapply.

Использование expand.grid создать все комбинации monCode и yearRange затем do.call(sprintf,...) конкатенировать их

f <- expand.grid(monCode,yearRange) 
outList <- do.call(sprintf, c(f, fmt = 'IB%s%s comdty')) 
+0

я получаю сообщение об ошибке 'Ошибка в функции ((FMT, ...): слишком мало arguments' от' do.call'. Я смог получить что-то полезное из 'paste0 (« IB », f [, 1], f [, 2],« Comdty »)' - я не понимаю 'sprintf' достаточно чтобы решить проблему. Какая ошибка? – ricardo

+0

Проблема заключалась в использовании 'list (...' вместо 'c (...'. См. редактирование. – mnel

+0

+1/принято. чтобы устранить большинство моих вложенных циклов. – ricardo

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