如何在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
相关产品推荐
相关产品推荐

