我有三个数据框列表如下
set.seed(1)
dat <- as.data.frame(replicate(n = 8, expr = round(rnorm(3), 2)))
colnames(dat) <- LETTERS[1:8]
dat_list <- list(dat1 = dat,
dat2 = dat[, 1:7],
dat3 = dat[, 1:4])
dat3
是dat2
的子集,是dat1
的子集。
我有另一个列表列表,其中每个对象包含三个命名的字符向量列表。字符向量指的是上面数据集的列名。该列表看起来像这样
set.seed(1)
colnames_list <-
lapply(c(6, 4, 2), function(x)
replicate(n = 1, sample(
names(dat), size = x, replace = FALSE
)))
colnames_list <- lapply(colnames_list, as.vector)
names(colnames_list) <- names(dat_list)
model_list <- list(rpart = colnames_list,
lm = colnames_list)
model_list[1]
#$rpart
#$rpart$dat1
#[1] "C" "H" "D" "E" "A" "G"
#$rpart$dat2
#[1] "H" "E" "D" "A"
#$rpart$dat3
#[1] "B" "H"
对于每个模型,我只想选择dat_list
中包含在model_list
的相应对象中的那些变量。当然,在这个例子中,每个模型的结果都是相同的。
我可以使用嵌套的for
循环执行此操作,如下所示
subset_list <- list()
for (i in names(model_list)) {
subset_list[[i]] <- list()
for (j in names(dat_list)) {
subset_list[[i]][[j]] <- dat[, model_list[[i]][[j]]]
}
}
subset_list[1]
#$rpart
#$rpart$dat1
# C H D E A G
#1 0.49 0.78 -0.31 -0.62 -0.63 0.82
#2 0.74 0.07 1.51 -2.21 0.18 0.59
#3 0.58 -1.99 0.39 1.12 -0.84 0.92
#$rpart$dat2
# H E D A
#1 0.78 -0.62 -0.31 -0.63
#2 0.07 -2.21 1.51 0.18
#3 -1.99 1.12 0.39 -0.84
#$rpart$dat3
# B H
#1 1.60 0.78
#2 0.33 0.07
#3 -0.82 -1.99
这段代码应该是一个函数的一部分,它迭代一些更多的模型,选择重要的变量并再次重新估计模型。由于我正在处理的数据集包含数百个变量,我想知道是否有人可以建议更有效/更智能的方法来完成此任务。非常感谢你。
答案 0 :(得分:2)
我相信一个lapply
应该比嵌套循环更有效。
subset_list <- lapply(model_list, function (model) {
dat1 <- dat[,model$dat1]
dat2 <- dat[,model$dat2]
dat3 <- dat[,model$dat3]
list(dat1 = dat1, dat2 = dat2, dat3 = dat3)
})