R создает 5 переменных с суффиксом имени столбца с 1 по 5, используя цикл - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь создать итеративную функцию в R, используя цикл или массив, который создаст три переменные и три фрейма данных с одинаковым суффиксом 1-3. Мой текущий код:

function1 <- function(b1,lvl1,lvl2,lvl3,b2,x) {

 lo1 <- exp(b1*lvl1 + b2*x)
 lo2 <- exp(b1*lvl2 + b2*x)
 lo3 <- exp(b1*lvl3 + b2*x)

 out1 <- t(c(lv1,lo1))
 out2 <- t(c(lvl2,lo2))
 out3 <- t(c(lvl3,lo3))

 out <- rbind(out1, out2, out3)
 colnames(out) <- c("level","risk")
 return(out)
}

function1(.18, 1, 2, 3, .007, 24)

Однако я хотел бы повторить одну и ту же строку кода три раза, чтобы создать lo1, lo2, lo3 и out1, out2 и out3. Синтаксис ниже совершенно неправильный, потому что я не знаю, как использовать два аргумента в цикле for или вкладывать цикл for в функцию, но это грубая идея:

function1 <- function(b1,b2,x) {

for (i in 1:3) {

loi <- exp(b1*i + b2*x)
return(lo[i])

outi <- t(c(i, loi)
return(out[i])

}

out <- rbind(out1, out2, out3)
colnames(out) <- c("level","risk")
return(out)
}

function1(.18,.007,24)

Вывод должен выглядеть так:

level  risk
1      1.42
2      1.70
3      2.03

1 Ответ

1 голос
/ 24 мая 2019

В R петли for действительно неэффективны .Хорошей практикой является использование всех функций из семейства apply и попытка использовать как можно больше vectorization. Здесь приведены некоторые обсуждения по этому поводу.

Для вашей работы вы можете просто сделать это с помощью структуры dataframe.Вот пример:

# The function
function1 <- function(b1,b2,level,x) {
  # Create the dataframe with the level column
  df = data.frame("level" = level)

  # Add the risk column
  df$risk = exp(b1*df$level + b2*x)

  return(df)
}

# Your variables
b1 = .18
b2 = .007
level = c(1,2,3)

# Your process
function1(b1, b2, level, 24)
#   level     risk
# 1     1 1.416232
# 2     2 1.695538
# 3     3 2.029927
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...