如何用tidyverse的map系列函数拆分tibble并保存到环境?
解决方法
你原来的代码存在两个核心问题:
- 迭代对象错误:对
my_tibble调用map会默认按列迭代该tibble,而非你定义的列分组列表cols_list select参数传递错误:未正确传入每个分组的列名向量
以下是基于tidyverse/purrr的正确实现方案:
步骤1:给列分组列表添加命名
为了让拆分后的对象有清晰的名称,直接给cols_list设置对应名字:
cols_list <- list( grA = c("col1", "col2"), grB = c("col3", "col4"), grC = c("col5", "col6") )
步骤2:用map生成拆分后的tibble列表
迭代cols_list,对每个列分组调用select提取对应列:
split_tibbles <- map(cols_list, ~my_tibble %>% select(all_of(.x)))
- 使用
all_of(.x)是为了明确告诉select我们要使用字符串向量中的列名,避免tidyselect非标准评估的歧义问题
步骤3:将列表中的tibble保存到全局环境
用purrr::iwalk(可同时访问列表元素和对应名字),把每个tibble赋值为环境中的独立对象:
iwalk(split_tibbles, ~assign(.y, .x, envir = .GlobalEnv))
.y对应列表元素的名字(即grA/grB/grC),.x对应拆分后的tibbleenvir = .GlobalEnv指定将对象保存到全局环境
完整简化代码
把上述步骤合并,可写成更简洁的形式:
library(tidyverse) # 创建示例tibble my_tibble <- tibble( col1 = rnorm(10), col2 = runif(10), col3 = letters[1:10], col4 = sample(1:100, 10, replace = TRUE), col5 = factor(rep(c("A", "B"), 5)), col6 = LETTERS[1:10] ) # 定义带命名的列分组 cols_list <- list( grA = c("col1", "col2"), grB = c("col3", "col4"), grC = c("col5", "col6") ) # 拆分并保存到全局环境 cols_list %>% map(~my_tibble %>% select(all_of(.x))) %>% iwalk(~assign(.y, .x, envir = .GlobalEnv))
执行完成后,你可以直接调用grA、grB、grC来访问拆分后的小型tibble。
内容的提问来源于stack exchange,提问作者Tenstu
相关产品推荐
相关产品推荐

