簡體   English   中英

在list2serv(lapply(),)內組合多個函數參數

[英]Combining multiple function arguments inside list2serv(lapply(),)

我正在使用十個訓練數據集(從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似乎被我打算在a,b,c,d參數的值中讀取的四個mget()函數所混淆,但是我不確定接下來如何進行。

有什么建議么?

您希望盡可能將所有數據保留在列表中,以避免用一堆變量污染全局環境。 這未經測試, 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
})

我們可以使用以下代碼來實現。

# 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的train1lapply(fit, coef)拉出所有10個模型的coef,並將它們存儲在列表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM