通过字符向量列表列表从数据帧列表中选择变量的有效方法

时间:2018-01-25 13:47:16

标签: r list loops

我有三个数据框列表如下

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])

dat3dat2的子集,是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

这段代码应该是一个函数的一部分,它迭代一些更多的模型,选择重要的变量并再次重新估计模型。由于我正在处理的数据集包含数百个变量,我想知道是否有人可以建议更有效/更智能的方法来完成此任务。非常感谢你。

1 个答案:

答案 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)
})