从R数据框Income列提取数值并生成Avg列的实现方案
提取收入区间数值并计算平均值(R实现)
问题场景
现有R数据框:
df <- data.frame(Income = c("$100to$200","under$100","above$1000"))
需要从Income列提取数值:若为区间(含两个数值)则取平均值,若为单值描述则直接取用该数值,最终得到目标数据框:
df_final <- data.frame(Avg = c(150,100,1000))
解决方案1:stringr+dplyr(tidyverse风格)
library(stringr) library(dplyr) df <- data.frame(Income = c("$100to$200","under$100","above$1000")) df_final <- df %>% # 提取字符串中的所有数字,生成列表列 mutate(nums = str_extract_all(Income, "\\d+")) %>% # 遍历数字列表,计算平均值或直接取单值 mutate(Avg = sapply(nums, function(x) { x_num <- as.numeric(x) if (length(x_num) == 2) mean(x_num) else x_num })) %>% # 仅保留目标列 select(Avg) # 查看结果 df_final
解决方案2:基础R实现(无需额外包)
df <- data.frame(Income = c("$100to$200","under$100","above$1000")) # 提取每个字符串中的数字,得到数字列表 nums_list <- regmatches(df$Income, gregexpr("\\d+", df$Income)) # 计算每个列表的平均值/单值,转为目标数据框 df_final <- data.frame( Avg = sapply(nums_list, function(x) { x_num <- as.integer(x) if (length(x_num) == 2) mean(x_num) else x_num }) ) # 查看结果 df_final
核心逻辑说明
- 用正则表达式
\\d+匹配字符串中的所有连续数字,忽略数字前后的符号或描述性文字 - 对提取到的数字列表做判断:长度为2时计算平均值,长度为1时直接返回该数值
- 两种方法最终都能生成符合需求的
df_final数据框
内容的提问来源于stack exchange,提问作者Tina
相关产品推荐
相关产品推荐

