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

如何在R语言管道操作中用case_when处理向量中的范围字符串?

解决方案

首先构造模拟爬取得到的混合向量:

library(tidyverse)

num_vec <- c("100", "112 - 150", "85", "200 - 250")

方法1:先处理向量再转数据框

通过map_dbl遍历每个元素,结合case_when判断字符串类型并处理:

processed_vec <- num_vec %>%
  map_dbl(function(x) {
    case_when(
      # 识别范围型字符串
      str_detect(x, "-") ~ {
        # 提取所有数字、转数值后计算均值
        nums <- str_extract_all(x, "\\d+") %>% unlist() %>% as.numeric()
        mean(nums)
      },
      # 单个数字直接转数值
      TRUE ~ as.numeric(x)
    )
  })

# 存入数据框
result_df <- tibble(原始字符串 = num_vec, 处理后数值 = processed_vec)

方法2:直接在数据框中处理(更贴合tidyverse流程)

如果后续目标是存入数据框,可直接将向量放入tibble后用mutate处理,省去单独处理向量的步骤:

result_df <- tibble(原始字符串 = num_vec) %>%
  mutate(
    处理后数值 = case_when(
      str_detect(原始字符串, "-") ~ str_extract_all(原始字符串, "\\d+") %>%
        map_dbl(~ mean(as.numeric(.x))),
      TRUE ~ as.numeric(原始字符串)
    )
  )

关键说明

  • str_detect(原始字符串, "-")精准识别范围型字符串
  • str_extract_all(..., "\\d+")捕获字符串中所有连续数字,确保能提取范围两端的数值
  • map_dbl对每个提取出的数字列表计算均值,保证输出为数值型向量
  • 全程使用tidyverse生态工具,无常规if语句,完全贴合管道化操作风格

内容的提问来源于stack exchange,提问作者HoelR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:20:41