R语言批量修改列表内tibble数据类型及解决map2报错
报错原因
- 核心问题1:
map2要求传入的两个序列长度完全相等,你存储tibble的列表tbl长度为2(共2个表),但定义的data_types长度为3,长度不匹配直接触发报错。 - 核心问题2:原代码逻辑即使修正长度也无法得到正确结果:现有写法是把整个tibble直接传入类型转换函数,会把整张表强制转成字符向量,根本不是按列转换类型的逻辑。
正确实现代码
如果所有tibble的列数、列顺序一致,要复用同一套列类型转换规则,data_types的长度需要和单个tibble的列数保持一致,不需要和tibble的个数对齐。
library(tidyverse) tbl1 = tibble(x = c('a', 'b', 'c'), y = 1:3) tbl2 = tibble(x = c('11', '12', '13'), y = 1:3) tbl = list(tbl1, tbl2) # 示例里每个tibble共2列,所以类型向量长度设为2,对应x、y两列的目标类型 data_types = rep("character", times = 2) # 外层遍历每个tibble,内层逐列匹配类型做转换 tbl <- map(tbl, function(current_tbl) { map2_dfc(current_tbl, str_c("as.", data_types), ~ get(.y)(.x)) })
扩展场景:每个表转换规则不同
如果列表里每个tibble需要的列类型规则不一样,可以把类型规则存成和tibble列表等长的嵌套列表,每个子元素对应一个表的列类型向量即可:
# 示例:第一个表两列都转字符,第二个表x转数值、y转字符 data_types_list <- list( rep("character", 2), c("numeric", "character") ) tbl <- map2(tbl, data_types_list, function(current_tbl, col_types) { map2_dfc(current_tbl, str_c("as.", col_types), ~ get(.y)(.x)) })
内容的提问来源于stack exchange,提问作者Ed_Gravy
相关产品推荐
相关产品推荐

