You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:27:00