У меня есть набор входных данных, который может выглядеть примерно так:

DF=data.frame(
    Variable = c("Test1", "Test2", "Test3"), 
    Distribution = c("Normal", "Exponential","Poisson"),
    Variable = c(2, 3, 4), 
    SD = c(2, NA, NA))

Я хочу использовать функции случайной вероятности (например, rnorm rexp и rbinom), используя распределения, указанные во фрейме данных DF.

Итак, как мне превратить ввод текста в правильные функции?

Я хочу использовать соответствующие значения в столбцах Variable и SD в качестве средних значений / стандартных отклонений, если это необходимо.

3
sym246 14 Мар 2018 в 14:15

2 ответа

Лучший ответ

Решение @ r.user.05apr работает, но включает в себя некоторый синтаксический анализ выражений, который здесь не нужен. Мы могли бы сделать это намного проще, создав список функций, чтобы использовать их позже.

# generating data:
DF=data.frame(
  Variable = c("Test1", "Test2", "Test3"), 
  Distribution = c("Normal", "Exponential","Poisson"),
  VariablePrm = c(2, 3, 4), 
  SD = c(2, NA, NA),
  stringsAsFactors = FALSE)

# creating function list and selecting this functions by Distribution column
fun_vec <- c(Normal=rnorm, Exponential=rexp, Poisson=rpois)
DF$fun <- fun_vec[DF$Distribution]

# if SD is NA then simply call function only with variablePrm
# else call with sd
# 10 is the number of observations to generate
generate <- function(x) {
  if(is.na(x$SD)){
    x$fun(10, x$VariablePrm)
  }else{
    x$fun(10, x$VariablePrm, x$SD)
  }
}
# if we apply this functions to each row we will get matrix of results
# each column will have 10 rows of generated data for previously selected distribution
apply(DF, 1, generate)
2
bartektartanus 14 Мар 2018 в 15:16

Что-то типа:

DF=data.frame(
  Variable = c("Test1", "Test2", "Test3"), 
  Distribution = c("Normal", "Exponential","Poisson"),
  VariablePrm = c(2, 3, 4), 
  SD = c(2, NA, NA),
  stringsAsFactors = FALSE)

# functions-lookup
fun_vec <- c("rnorm", "rexp", "rpois")
names(fun_vec) <- c("Normal", "Exponential", "Poisson")
DF$fun <- fun_vec[DF$Distribution]

# create expr
my_expr <- function(x) {
  txt <- paste0(x[1], "<-", x[5], "(", 10, ", ", x[3], 
                ifelse(is.na(x[4]), "", 
                       paste0(", ", x[4])), ")")
}
want <- apply(DF, 1, function(x) eval(parse(text = my_expr(x))))
colnames(want) <- DF$Variable
want
0
r.user.05apr 14 Мар 2018 в 13:35