如何在R中展开数据框内逗号、连字符分隔的数字范围?
R语言:展开数据框中带范围/分隔的数值列(seqToHumanReadable逆操作)
需求说明
需要实现R.utils包中seqToHumanReadable函数的逆操作:将数据框LLFCs列中以逗号、&分隔的单个数值,以及短横线连接的数值范围,展开为每行一个数值,同时保留Title和Red列的对应值。
输入数据
# 输入数据框 df <- data.frame( Title = c("a", "b", "c", "d"), LLFCs = c("15, 18", "16 & 19", "112-114", "113-115,145-147"), Red = c(11.65, 9.08, 6.45, 6.45), stringsAsFactors = FALSE )
输入表格形式:
| Title | LLFCs | Red |
|---|---|---|
| a | 15, 18 | 11.65 |
| b | 16 & 19 | 9.08 |
| c | 112-114 | 6.45 |
| d | 113-115,145-147 | 6.45 |
预期输出
| Title | LLFCs | Red |
|---|---|---|
| a | 15 | 11.65 |
| a | 18 | 11.65 |
| b | 16 | 9.08 |
| b | 19 | 9.08 |
| c | 112 | 6.45 |
| c | 113 | 6.45 |
| c | 114 | 6.45 |
| d | 113 | 6.45 |
| d | 114 | 6.45 |
| d | 115 | 6.45 |
| d | 145 | 6.45 |
| d | 146 | 6.45 |
| d | 147 | 6.45 |
解决方案(tidyverse 实现)
步骤1:加载依赖包
library(tidyverse)
步骤2:定义解析函数
该函数负责将单个LLFCs字符串解析为展开后的数值向量:
expand_llfcs <- function(x) { # 统一分隔符:将&替换为逗号 x <- str_replace_all(x, " & ", ", ") # 按逗号分割成多个片段 parts <- str_split(x, ",\\s*")[[1]] # 逐个处理片段:范围则生成序列,单个值则直接转换 map(parts, function(part) { if (str_detect(part, "-")) { range_vals <- as.integer(str_split(part, "-")[[1]]) seq(range_vals[1], range_vals[2]) } else { as.integer(part) } }) %>% unlist() }
步骤3:处理数据框并展开
result <- df %>% mutate(LLFCs = map(LLFCs, expand_llfcs)) %>% unnest(LLFCs) # 查看最终结果 print(result)
执行上述代码后,得到的result数据框即符合预期输出格式。
基础R 实现(可选)
如果不习惯使用tidyverse,也可以用基础R循环处理:
# 初始化结果列表 result_list <- list() for (i in 1:nrow(df)) { current_row <- df[i, ] llfcs_str <- current_row$LLFCs # 统一分隔符 llfcs_str <- gsub(" & ", ", ", llfcs_str) parts <- strsplit(llfcs_str, ",\\s*")[[1]] # 处理每个片段 for (part in parts) { if (grepl("-", part)) { range_vals <- as.integer(strsplit(part, "-")[[1]]) vals <- seq(range_vals[1], range_vals[2]) } else { vals <- as.integer(part) } # 添加到结果列表 for (val in vals) { result_list[[length(result_list) + 1]] <- data.frame( Title = current_row$Title, LLFCs = val, Red = current_row$Red, stringsAsFactors = FALSE ) } } } # 合并为数据框 result <- do.call(rbind, result_list)
内容的提问来源于stack exchange,提问作者Neil P
相关产品推荐
相关产品推荐

