【问题标题】:Select columns of tibbles in a list based on the values from the other list根据另一个列表中的值选择列表中的小标题列
【发布时间】:2019-10-28 09:33:38
【问题描述】:

我有一个 tibbles 列表:

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 来做。

【问题讨论】:

    标签: r list purrr tibble


    【解决方案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")。然后所有调用的结果都以列表的形式返回。

    【讨论】:

      【解决方案2】:

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

      如果成功了请告诉我。

      【讨论】:

      • 没有看到问题的最后一部分删除不在select_columns中的dfs;将很快编辑答案。
      猜你喜欢
      • 1970-01-01
      • 2012-01-30
      • 2020-02-16
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2015-07-02
      相关资源
      最近更新 更多