如何解析数值范围?将DataFrame区间Range列展开为单个值
解析范围字符串并展开为单个项的DataFrame
原始数据
range <- structure(list(Range = c("0T-1T", "2T-5T")), class = "data.frame", row.names = c(NA, -2L))
目标
将范围字符串(如0T-1T、2T-5T)展开为包含每个单独项的DataFrame,最终输出如下:
structure(list(Range = c("0T", "1T", "2T", "3T", "4T", "5T")), class = "data.frame", row.names = c(NA, -6L))
解决方案1:使用tidyverse工具链
借助tidyr和dplyr完成拆分、生成序列、展开的流程:
library(tidyverse) range2 <- range %>% # 拆分范围字符串为起始和结束项 separate(Range, into = c("start", "end"), sep = "-") %>% mutate( # 提取数字部分并转为整数 start_num = as.integer(str_remove(start, "T")), end_num = as.integer(str_remove(end, "T")), # 生成从起始到结束的数字序列,拼接"T"后缀 Range = map2(start_num, end_num, ~paste0(.x:.y, "T")) ) %>% # 保留目标列并展开列表 select(Range) %>% unnest(Range)
解决方案2:基础R实现
如果不想加载第三方包,用基础R函数也能完成:
# 遍历每个范围字符串,生成对应序列 expanded_list <- lapply(range$Range, function(range_str) { # 拆分字符串为起始和结束部分 parts <- strsplit(range_str, "-")[[1]] # 提取数字并转为整数 start <- as.integer(sub("T", "", parts[1])) end <- as.integer(sub("T", "", parts[2])) # 生成带"T"后缀的序列 paste0(start:end, "T") }) # 合并为DataFrame range2 <- data.frame(Range = unlist(expanded_list))
验证结果
运行dput(range2)即可得到目标输出。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

