r - R 在列表列工作流程中使用 dplyr::select()
问题描述
我有一个大型数据框列表,我想对每个数据框进行子集化,只保留某些列。我想要的列的名称包含在每个数据帧唯一的字符向量中。
一种方法是使用列表列工作流。我将创建一个数据框,其中包含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
ing 或[[
in提取来提取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 ))))
推荐阅读
- sql - 如何迭代行以创建组
- python - Python concurrent.futures 饥饿
- tiff - 使用 LibTif 从 tif 文件中读取 tif 标签[编辑:添加示例代码]
- python - 无法将较大的 blob 上传到 Azure:azure.core.exceptions.ServiceRequestError:操作未完成(写入)(_ssl.c:2317)
- c# - 没有参数对应于所需的形式参数构造函数需要帮助
- javascript - 这个 Firestore 时间戳到我的 Angular 应用程序中的日期转换有什么问题?
- python - DBSCAN 中预先计算的距离矩阵
- python - python函数说“函数中没有属性”
- jenkins - 使用命令“mvn test”时詹金斯无法识别类路径
- kiba-etl - 如何过滤提取器中的数据?