Select 个列表中的 tibbles 列基于另一个列表中的值

Select columns of tibbles in a list based on the values from the other list

我有一个 tibbles 列表:

dfs <- list()
dfs[["mtcars"]] <- mtcars
dfs[["iris"]] <- iris
dfs[["ToothGrowth"]] <- ToothGrowth

我想将一个函数应用到基于此列表选择 tibbles 列的列表:

select_columns <- list()
select_columns[["mtcars"]] <- c("mpg", "vs:carb")
select_columns[["iris"]] <- c("Sepal.Length:Petal.Length", "Species")

两个列表的名称相同,但有些未包含在 select_columns!
中 所以最后我想获得与 dfs 相同的 tibbles 列表,但只包含 select_columns 中指定的列。如果 select_columns 中未提及 tibble,请将其从 dfs 中删除。
我想使用 purrr 来完成。

我认为 lapplymap 的组合在这里可以工作。代码:

require(dplyr)
require(purrr)

newDfs=setNames(lapply(names(dfs),function(name){
  if(length(select_columns[[name]])>0){
  bind_cols(map(select_columns[[name]],~dplyr::select_(.data=dfs[[name]],.x)))
  }else{
      NULL
    }
}),names(dfs))


newDfs=newDfs[-which(sapply(newDfs, is.null))]

如果成功了请告诉我。

library(purrr)
library(dplyr)

map2(
  dfs[names(select_columns)],
  select_columns,
  ~do.call("select_", c(list(.x), as.list(.y)))
)

这通过对 data.frame - select 向量。在这种情况下,它是:

  1. mtcars - c("mpg", "vs:carb")
  2. 虹膜-c("Sepal.Length:Petal.Length", "Species").

在每个步骤中,它都会构造并评估一个 dplyr::select_ 调用。对于第一对,例如构造的调用看起来像 select_(mtcars, "mpg", "vs:carb")。然后在列表中返回所有调用的结果。