我有一个小名单:
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
来做。
答案 0 :(得分:1)
library(purrr)
library(dplyr)
map2(
dfs[names(select_columns)],
select_columns,
~do.call("select_", c(list(.x), as.list(.y)))
)
这通过配对data.frame-选择向量。在这种情况下,它是:
在每个步骤中,它都会构造并评估一个dplyr::select_
调用。对于第一对构造的调用看起来像select_(mtcars, "mpg", "vs:carb")
。然后,所有呼叫的结果都将返回到列表中。
答案 1 :(得分:0)
我认为lapply
和map
的组合将在这里起作用。代码:
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))]
让我知道是否可行。