根据其他列表中的值选择列表中的小标题列

时间:2019-10-28 09:33:38

标签: r list purrr tibble

我有一个小名单:

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

我想对列表应用一个函数,以基于该列表选择小标题列:

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

两个列表的名称相同,但是select_columns中不包含其中一些!
因此,最后我希望获得与dfs相同的小标题列表,但仅包含select_columns中指定的列。如果select_columns中未提及tibble,请将其从dfs中删除。
我想用purrr来做。

2 个答案:

答案 0 :(得分:1)

library(purrr)
library(dplyr)

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

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

  1. mtcars-c(“ mpg”,“ vs:carb”)
  2. iris-c(“ Sepal.Length:Petal.Length”,“ Species”)。

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

答案 1 :(得分:0)

我认为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))]

让我知道是否可行。