【问题标题】:Efficient way to select variables from a list of data frames by a list of list of character vectors通过字符向量列表从数据帧列表中选择变量的有效方法
【发布时间】:2018-01-25 13:47:16
【问题描述】:

我有如下三个数据框的列表

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 的子集,dat1dat1 的子集。

我有另一个列表,其中每个对象包含三个命名的字符向量列表。字符向量指的是上面数据集的列名。列表看起来像这样

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

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

【问题讨论】:

  • 您能否澄清一下,您希望model_list 中的列列表与其对应的dat_list 中的列列表匹配吗?根据我推测的索引?
  • 查看@csgroen 的解决方案,我意识到dat_list 甚至没有必要。但是是的。

标签: r list loops


【解决方案1】:

我相信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)
})

【讨论】:

  • 非常感谢。确实是一个更智能的解决方案。我想我太专注于循环了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
  • 2020-11-08
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多