繁体   English   中英

R 在列表列工作流中使用 dplyr::select()

[英]R using dplyr::select() in a list-column workflow

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

一种方法是使用列表列工作流。 我将创建一个数据框,其中包含一个包含数据框的data列表列和一个包含字符向量的cols列表列。

它的实际应用将包括一个包含 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()都将列名称的向量视为列表,而不是向量。 我很难过如何改变这种行为。

在此先感谢您的帮助!

两者都是list列。 我们可以通过unlist或者用[[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 ))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM