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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:55:24