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

如何在R语言中将含数值的字符型变量拆分为Price与Bonus两个数值列?

嘿,我来帮你搞定这个字符串提取的需求!这里有两种实用的方法,不管你习惯用tidyverse工具链还是基础R,都能轻松得到你想要的Price和Bonus列。

方法一:用tidyverse工具包(推荐,代码更直观)

如果你平时习惯用dplyr和stringr这类工具,这种方法的可读性会很强:

# 先加载需要的包(如果没装的话先运行install.packages("tidyverse"))
library(tidyverse)

# 你的原始字符向量(注意别用sum当变量名,sum是R的内置函数,容易冲突)
sum_vec <- c("40 Da + 12 Da de primes", "40 Da + 12 Da de primes", "50 Da", "50 Da", "50 Da")

# 一步步处理生成目标数据框
result_df <- tibble(original_text = sum_vec) %>%
  # 提取每个字符串里的所有数字,得到一个列表列
  mutate(numbers = str_extract_all(original_text, "\\d+")) %>%
  # 拆分列表列,生成Price和Bonus
  mutate(
    Price = as.numeric(map_chr(numbers, ~ .x[1])),  # 取每个列表的第一个数字
    Bonus = as.numeric(map_chr(numbers, ~ ifelse(length(.x) >= 2, .x[2], "0")))  # 有第二个数字就取,没有填0
  ) %>%
  # 可选:去掉中间的辅助列
  select(Price, Bonus)

# 查看结果
print(result_df)

运行后你会得到:

# A tibble: 5 × 2
  Price Bonus
  <dbl> <dbl>
1    40    12
2    40    12
3    50     0
4    50     0
5    50     0

方法二:基础R实现(无需额外安装包)

如果不想装新包,用基础R的正则工具也能实现:

# 原始字符向量
sum_vec <- c("40 Da + 12 Da de primes", "40 Da + 12 Da de primes", "50 Da", "50 Da", "50 Da")

# 提取每个字符串中的所有数字,得到一个列表
numbers_list <- regmatches(sum_vec, gregexpr("\\d+", sum_vec))

# 生成Price列:取每个列表的第一个元素并转成数值
Price <- as.numeric(sapply(numbers_list, function(x) x[1]))

# 生成Bonus列:存在第二个数字就取,否则填0
Bonus <- as.numeric(sapply(numbers_list, function(x) if (length(x) >= 2) x[2] else 0))

# 合并成数据框
result_df <- data.frame(Price, Bonus)

# 查看结果
print(result_df)

这个方法的输出和上面完全一致,核心是用gregexpr匹配所有数字位置,再用regmatches提取出来,最后用sapply遍历列表处理每一项。

小提醒:尽量别用sum作为变量名哦,它是R的内置求和函数,容易引发不必要的冲突~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:08:14