【问题标题】:R using dplyr::select() in a list-column workflowR 在列表列工作流程中使用 dplyr::select()
【发布时间】:2020-10-23 23:01:33
【问题描述】:

我有一个大型数据框列表,我想对每个数据框进行子集化,只保留某些列。我想要的列名包含在每个数据帧唯一的字符向量中。

执行此操作的一种方法是使用列表列工作流程。我将创建一个数据框,其中 data list-column 保存数据框,cols list-column 保存字符 向量。

真正的应用将包括一个包含 24 个大型数据集的列表,以及一个包含 24 个独特字符向量的列表。下面是这个数据结构的一个最小例子来说明这个问题:

set.seed(2346)
df <- tibble(
  col1 = sample(c(0,1), replace=T, size=10),
  col2 = sample(c(0,1), replace=T, size=10),
  col3 = sample(c(0,1), replace=T, size=10),
  col4 = sample(c(0,1), replace=T, size=10)
)

cols <- c("col1", "col3")

df_list_col <- tibble(
  data = list(df), 
  cols = list(cols)
)

df_list_col 具有列表列结构,但仅在一行中。

我尝试的解决方案是创建第三个列表列来保存 子集的数据帧。因此:

df_output <- df_list_col %>% 
  mutate(subset = select(.$data, !!.$cols))

但这会返回错误:

#   Error: Problem with `mutate()` input `subset`.
# x `select()` doesn't handle lists.
# ℹ Input `subset` is `select(.$data, list(c("col1", "col3")))`.

我也尝试使用purrr::map 来应用该功能:

df_output <- df_list_col %>% 
  mutate(subset = map(.$data, ~ select(.x, !!.$cols)))

但这会返回类似的错误。在这两种情况下,select() 都将列名的向量视为列表,而不是向量。我对如何改变这种行为感到困惑。

提前感谢您的帮助!

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    两者都是list 列。我们可以通过unlisting 提取或在select 中用[[ 提取

    dplyr::select(df_list_col$data[[1]], unlist(df_list_col$cols))
    

    或者!!!的另一个选项

    select(df_list_col$data[[1]], !!! df_list_col$cols)
    

    或者使用tidyverse 语法

    library(dplyr)
    library(purrr)
    df_list_col %>% 
             mutate(subset = map2(data, cols, ~ .x %>% select(all_of(.y))))
    

    -输出

    # A tibble: 1 x 3
    #  data              cols      subset           
    #  <list>            <list>    <list>           
    #1 <tibble [10 × 4]> <chr [2]> <tibble [10 × 2]>
    

    pmap

    df_list_col %>%
         mutate(subset = pmap(cur_data(),  ~ select(..1, all_of(..2 ))))
    

    【讨论】:

    • 一如既往地感谢 akrun,这些都是很好的建议。我更喜欢mutate() 的选项,因为它在概念上最适合列表列工作流程。我将把它扩展到实际的数据问题,看看它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2020-10-01
    相关资源
    最近更新 更多