Выберите столбцы столбцов в списке на основе значений из другого списка - PullRequest
0 голосов
/ 28 октября 2019

У меня есть список элементов:

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. Если tibble не упоминается в select_columns, удалите его из dfs.
Я бы хотел сделать это, используя purrr.

Ответы [ 2 ]

1 голос
/ 28 октября 2019
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"). Затем результаты всех вызовов возвращаются в виде списка.

0 голосов
/ 28 октября 2019

Я думаю, что комбинация 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))]

Дайте мне знать, если получится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...