2015-08-13 7 views
1

Я работаю с десяти учебных наборов данных, train1 через train10, и хотел бы повторить следующие утверждения для 1 до 10 с помощью одного блока кода:Объединяя несколько аргументов функции внутри list2serv (lapply(),)

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() предпочтительнее для циклов. Мой код:

# 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() функция, которые я, предназначенной для чтения значений для а, б , c, d аргументы, но я не уверен, как действовать дальше.

Любые предложения?

ответ

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 
}) 
+0

Отлично, спасибо. Я добавил «train <- lapply (1:10, function (x) {paste0 (« поезд », x)}) для списка train1-train10. Я получаю сообщение об ошибке: «Ошибка в операторе $ y: $ недопустима для атомных векторов» при запуске кода – RobertF

+0

@RobertF 'train' должен быть списком ваших фактических наборов учебных материалов, если я читаю это право , Итак, если у вас есть все они в вашей глобальной среде, я думаю, что-то вроде «train <- mget (paste0 (« train », 1:10)) – jenesaisquoi

+0

Гораздо лучше, спасибо! Кажется, что программа работает нормально, хотя она не сохраняет выходные кадры данных для b, c и d. – RobertF

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 и lapply(fit, coef) вытаскивает кофр для всех 10 моделей и сохраняет их в списке.

+0

Спасибо Vlo, это фантастика! Мне нужно будет рассказать о пользователе%>%. К сожалению, у меня появляется сообщение об ошибке: «Ошибка: не удалось найти функцию«%>% »после запуска вашего кода. – RobertF

+0

@RobertF Вы выполнили 'library (dplyr)' успешно? – Vlo

+0

Да вот и все - код работал отлично. еще раз спасибо – RobertF

Смежные вопросы