如何从R数据框字符串列提取数值范围并展开对应行
解决方案
步骤1:提取Miles列中的数字与连字符
使用stringr包的str_extract函数,通过正则表达式\\d+(-\\d+)?匹配单个数字或数字范围(仅保留数字和连字符):
library(stringr) library(tidyr) library(dplyr) # 模拟数据集 Meters <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21) Miles <- c("zyx 1-2.jpg-Distance[zyx 1-2.jpg]", "zyx 15-19.jpg-Distance[zyx 15-19.jpg]", "zyx 19-23.jpg-Distance[zyx 19-23.jpg]", "zyx 24.jpg-Distance[zyx 24.jpg]", "zyx 25-28.jpg-Distance[zyx 25-28.jpg]", "zyx 29.jpg-Distance[zyx 29.jpg]", "zyx 3.jpg-Distance[zyx 3.jpg]", "zyx 30-32.jpg-Distance[zyx 30-32.jpg]", "zyx 33-36.jpg-Distance[zyx 33-36.jpg]", "zyx 37-43.jpg-Distance[zyx 37-43.jpg]", "zyx 44-52.jpg-Distance[zyx 44-52.jpg]", "zyx 53-54.jpg-Distance[zyx 53-54.jpg]", "zyx 55.jpg-Distance[zyx 55.jpg]", "zyx 56-64.jpg-Distance[zyx 56-64.jpg]", "zyx 6.jpg-Distance[zyx 6.jpg]", "zyx 65-76.jpg-Distance[zyx 65-76.jpg]", "zyx 7-14.jpg-Distance[zyx 7-14.jpg]", "zyx 77-78.jpg-Distance[zyx 77-78.jpg]", "zyx 79-83.jpg-Distance[zyx 79-83.jpg]", "zyx1_ 4-5.jpg-Distance[zyx1_ 4-5.jpg]", "zyx2_ 4-5.jpg-Distance[zyx2_ 4-5.jpg]") Wheels <-c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1) Empty <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) Trip <- data.frame(Meters, Miles, Wheels, Empty) # 提取数字和连字符 Trip <- Trip %>% mutate(miles_range = str_extract(Miles, "\\d+(-\\d+)?"))
步骤2:展开数值范围为单独行
拆分提取出的范围,生成连续数值序列,再通过unnest展开为多行,同时保留其他列的原始值:
# 拆分范围并生成序列 Trip_expanded <- Trip %>% # 拆分起始和结束数字,无范围的行自动填充结束值为起始值 separate(miles_range, into = c("start", "end"), sep = "-", fill = "right") %>% mutate( end = ifelse(is.na(end), start, end), start = as.integer(start), end = as.integer(end), # 生成从start到end的连续数值序列 miles_value = map2(start, end, seq) ) %>% # 将序列展开为单独行 unnest(miles_value) %>% # 移除中间辅助列 select(-start, -end)
处理完成后,Trip_expanded即为目标结果:原数据中的每个数值范围会被拆分为单独行(如15-19会生成5行,对应15、16、17、18、19),且Meters、Wheels、Empty等列的对应值会在各行中保留。
内容的提问来源于stack exchange,提问作者Zard22
相关产品推荐
相关产品推荐

