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

如何在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
)

输入表格形式:

TitleLLFCsRed
a15, 1811.65
b16 & 199.08
c112-1146.45
d113-115,145-1476.45

预期输出

TitleLLFCsRed
a1511.65
a1811.65
b169.08
b199.08
c1126.45
c1136.45
c1146.45
d1136.45
d1146.45
d1156.45
d1456.45
d1466.45
d1476.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:40:25