我正在使用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>
有什么建议吗?
答案 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,并将它们存储在列表中。