R语言:如何将含复合名称的不等长列表转换为带指定字段的tibble
解决方案
核心拆分逻辑不需要按固定位置切分列表元素,而是以4位数字格式的年份值为固定锚点做动态拆分,完全适配长度不等的多词国名、洲名场景。
问题根因
之前用plyr::ldply()没得到正确结果,本质是硬套固定位置对齐的逻辑:不同列表元素的长度本来就不一样,多词国名(比如“United States of America”拆成4个片段)、多词大洲名(比如“North America”拆成2个片段)的长度不固定,按位置对齐时必然出现错位,把本该属于国名的片段错放到大洲列,反之亦然。
可直接运行的实现代码
首先加载需要的依赖包:
library(tidyverse)
编写单元素拆分逻辑:
process_element <- function(vec) { # 定位4位数字格式的年份所在索引 year_position <- str_which(vec, "^\\d{4}$") # 拼接年份之前的所有片段为完整国名 country <- str_c(vec[1:(year_position - 1)], collapse = " ") # 提取年份值 year <- vec[year_position] # 拼接年份之后的所有片段为完整大洲名 continent <- str_c(vec[(year_position + 1):length(vec)], collapse = " ") # 返回单行tibble tibble(country, year, continent) }
对整个测试列表逐元素处理并合并为目标tibble:
target_tibble <- map_dfr(test, process_element)
运行结果验证
输出的tibble完全匹配预期要求:
target_tibble # A tibble: 6 × 3 country year continent <chr> <chr> <chr> 1 United States of America 2021 North America 2 Canada 2021 North America 3 Morocco 2021 Africa 4 South Africa 2021 Africa 5 Faroe Islands 2021 Europe 6 Spain 2021 Europe
注:该逻辑兼容性较强,后续如果新增更长的多词国名、洲名片段,只要保持4位数字的年份作为分割锚点,不需要调整代码即可自动适配,不会因为元素长度不同出现错位问题。
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

