Как упростить вложенных условных операторов цикла for в R?


У меня этот цикл для создания списка переменных:

vars <- c( 'beta.o', 'sd.y') 
for (x in c('ghs', 'site', 'trt')) {
  if(model.parms[[x]] == 1) {
    data <- data[, which(names(data) != x)]
  } else {
    data <- data
    if(x!='ghs') {
      vars <- c(vars, paste('sd.', x, sep = ''))
    }
    m <- min(model.parms[[x]], 5)
    for (i in 1:m) {
      if(i == 1 && x == 'site') {
        vars <- c(vars, 'beta.site[1]')
      }
      if (i > 1) {
        vars <- c(vars, paste('beta.', x, '[', i, ']', sep=''))
      }
    }
  }
}

Это уже давно беспокоит меня ужасно, и я уже не в последние два раза я пытался заменить его, хотя концептуально она должна быть записана в несколько строк. Какие-либо советы?



1498
2
r
задан 24 марта 2011 в 09:03 Источник Поделиться
Комментарии
2 ответа

Этот бит:

for (i in 1:m) {
if(i == 1 && x == 'site') {
vars <- c(vars, 'beta.site[1]')
}
if (i > 1) {
vars <- c(vars, paste('beta.', x, '[', i, ']', sep=''))
}
}

Говорит ручка на первом проходе отдельно от всех остальных. Поэтому я бы заменил его с этим:

if (x == 'site') {
vars <- c(vars, 'beta.site[1]')
}
for (i in 2:m) {
vars <- c(vars, paste('beta.', x, '[', i, ']', sep=''))
}

3
ответ дан 24 марта 2011 в 10:03 Источник Поделиться

Большая ошибка в вашем коде вы динамично развивающейся векторами. Например, сравнить

x = NULL 
for(i in 1:100000)
x = c(x, i)

с

x = numeric(100000)
for(i in 1:100000)
x[i] = i

Другой ключевой момент заключается в том, что вставка функция может быть векторизированного. Так,

for (i in 1:m) {
if(i == 1 && x == 'site') {
vars <- c(vars, 'beta.site[1]')
}
if (i > 1) {
vars <- c(vars, paste('beta.', x, '[', i, ']', sep=''))
}
}

можно заменить

if(x == 'site') {
vars <- c(vars, 'beta.site[1]')
}
vars = c(vars, paste('beta.', x, '[', i, ']', sep=''))

1
ответ дан 15 февраля 2012 в 10:02 Источник Поделиться