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

如何用R从data.frame的字符型变量中提取量化信息并分类?

使用R处理文本型百分比数据的方案

步骤1:构造输入数据

先还原你的输入数据框:

df <- data.frame(
  id = 1:4,
  text_information = c("从10.81%增长至60.1%", "购入100.00%", "从5.9%增长至45.48%", "购入99.0%"),
  stringsAsFactors = FALSE
)

步骤2:用tidyverse工具处理数据

借助stringr提取数值、dplyr做数据转换,完整代码如下:

library(tidyverse)

result_df <- df %>%
  # 提取所有百分比数字,转换为小数形式
  mutate(
    nums = map(str_extract_all(text_information, "\\d+\\.*\\d*"), 
               ~ as.numeric(.x) / 100),
    # 根据文本关键词判断类型
    type = case_when(
      str_detect(text_information, "增长") ~ "increase",
      str_detect(text_information, "购入") ~ "purchase"
    ),
    # 提取最终持股比例share
    share = map_dbl(nums, ~ ifelse(length(.x) == 2, .x[2], .x[1])),
    # 计算增长差值,购入类型设为NA
    share_difference = case_when(
      type == "increase" ~ map_dbl(nums, ~ .x[2] - .x[1]),
      TRUE ~ NA_real_
    )
  ) %>%
  # 保留目标列并按需求保留小数位数
  select(id, share, share_difference, type) %>%
  mutate(
    share = round(share, 3),
    share_difference = round(share_difference, 3)
  )

print(result_df)

运行结果

执行后会得到你需要的输出:

id  share share_difference     type
1  1 0.601            0.492 increase
2  2 1.000               NA purchase
3  3 0.455            0.396 increase
4  4 0.990               NA purchase

关键逻辑说明

  • str_extract_all(text_information, "\\d+\\.*\\d*"):用正则表达式提取文本中的所有数字(包含小数格式)
  • map(nums, ~ as.numeric(.x)/100):将提取的百分比数字转换为小数形式
  • case_when:根据文本中的“增长”“购入”关键词,标记记录类型
  • 针对增长类型,取第二个数值作为最终持股比例,计算两数值的差值;购入类型直接提取唯一数值,差值设为NA

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:00:27