在list2serv中组合多个函数参数(lapply(),)

时间:2015-08-13 19:25:48

标签: r function lapply

我正在使用10个训练数据集,train1到train10,并希望使用一个代码块重复以下1到10的语句:

  train_y_1 <- c(train1$y)
  train1$y <-NULL
  train_x_1 <- data.matrix(train1) 
  olsfit_1 <- cv.glmnet(y=train_y_1, x=train_x_1, alpha=1, family="gaussian")

我在论坛中读到lapply()比for循环更可取。我的代码:

# Create empty data frames and list (to be populated with values in main program) 
list2env(setNames(lapply(1:10, function(i) data.frame()), paste0('train_y_', 1:10)), envir=.GlobalEnv)
list2env(setNames(lapply(1:10, function(i) data.frame()), paste0('train_x_', 1:10)), envir=.GlobalEnv)
list2env(setNames(lapply(1:10, function(i) list()), paste0('lasso_', 1:10)), envir=.GlobalEnv)

# Create y and x input matrices and run ten lasso regressions
  list2env(lapply(mget(paste0('train', 1:10)), mget(paste0('train_y_', 1:10)), mget(paste0('train_x_', 1:10)), mget(paste0('lasso_', 1:10)), 
  function(a,b,c,d) 
  {
    b <- c(a$y);
    a$y <- NULL;
    c <- data.matrix(a); 
    d <- cv.glmnet(y=b, x=c, alpha=1, family="gaussian");
  }), envir=.GlobalEnv)

产生错误消息:

Error in match.fun(FUN) : 
  'mget(paste0("train_y_", 1:10))' is not a function, character or symbol

所以看起来R被四个mget()函数搞糊涂了,我打算在a,b,c,d参数的值中读取这些函数,但我不知道接下来要怎么做。< / p>

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您希望尽可能将所有数据保留在列表中,避免使用一堆变量污染全局环境。这未经过测试,但train缺失,但应该是列车数据的类似列表。然后,你可以做类似的事情,

trainy <- setNames(lapply(1:10, function(i) data.frame()), paste0('train_y_', 1:10))
trainx <- setNames(lapply(1:10, function(i) data.frame()), paste0('train_x_', 1:10))
lasso <- setNames(lapply(1:10, function(i) list()), paste0('lasso_', 1:10))

f <-   function(a,b,c,d) {
    b <- c(a$y);
    a$y <- NULL;
    c <- data.matrix(a); 
    d <- cv.glmnet(y=b, x=c, alpha=1, family="gaussian");
}

mapply(f, train, trainy, trainx, lasso, SIMPLIFY=F)

虽然,由于您的列表只是初始化变量,您可能只想在训练数据列表上循环(apply),

lapply(train, function(x) {
    ...        # the statements you want to repeat
    list(...)  # return a list of the three data.frames
})

答案 1 :(得分:1)

我们可以使用以下代码实现此目的。

# Load libraries
library(dplyr);library(glmnet)
# Gather all the variables in global into a list
fit = mget(paste0("train", 1:10), envir = .GlobalEnv) %>%
# Pipe each element of the list into `cv.glmnet` function     
      lapply(function(dat) {cv.glmnet(y = dat$y,
                            x = data.matrix(dat %>% mutate(y = NULL)),
                            alpha = 1,
                            family = "gaussian")})

您的输出将整齐地存储在fit中,这是一个包含10个元素的列表。您可以使用fit[[i]]调用每个元素。例如,coef(fit[[1]])拉出train1的coefs,lapply(fit, coef)拉出所有10个模型的coef,并将它们存储在列表中。