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

