如何使用tidyverse高效拆分年级范围列,实现每行对应一条年级数据
实现方案
方案1(推荐,tidyverse原生实现,逻辑直观效率高)
不需要构造假连接字段再过滤冗余数据,直接拆分年级范围生成对应序列后展开即可,代码更简洁:
library(tidyverse) df_long <- df %>% # 按分隔符-拆分年级范围为起始、结束年级,convert参数自动转数值型 separate(grade_range, into = c("low_grade", "high_grade"), sep = "-", convert = TRUE, remove = FALSE) %>% # 为每一行生成对应年级区间的整数序列 mutate(grade_level = map2(low_grade, high_grade, seq)) %>% # 展开序列,生成学校-年级一一对应的行 unnest(grade_level) %>% # 清理不需要的临时列 select(-low_grade, -high_grade)
方案2(purrr实现,不需要单独拆分列)
如果你不想新增临时的高低年级列,也可以直接用purrr批量提取年级边界生成序列:
library(tidyverse) df_long <- df %>% mutate(grade_level = pmap( list( as.numeric(str_extract(grade_range, "^\\d+")), # 提取起始年级 as.numeric(str_extract(grade_range, "\\d+$")) # 提取结束年级 ), seq )) %>% unnest(grade_level)
两种方法输出结果和你现有代码的输出完全一致,相比原实现避免了全量12年级的笛卡尔积连接和过滤操作,数据量较大时运行效率更高。
内容的提问来源于stack exchange,提问作者EmKayDee
相关产品推荐
相关产品推荐

