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

如何在R中对dataframe列按不同长度截取子串并转为数值类型

在R数据框中提取首个空格前的数字并新增数值列

需要在R的dataframe中新增一列,提取现有字符串列中第一个空格前的字符,并转换为数值类型。

当前数据示例

HH_ID <- c("A123", "B123", "C123")
HH_MEMBERS <- c("12 Members","8 Members","14 Members")

df <- data.frame(HH_ID, HH_MEMBERS)

print(df)

输出:

HH_ID       HH_MEMBERS
1       A123        12 Members
2       B123         8 Members
3       C123        14 Members

期望结果

HH_ID       HH_MEMBERS   NEW_MEMBERS
1       A123        12 Members     12
2       B123         8 Members      8
3       C123        14 Members     14

之前尝试用substring(col_name, 1,1),但只能提取单个字符,无法捕获多位数字。


解决方法

方法1:Base R原生实现

用sub结合正则表达式匹配首个空格前的内容,再转为数值:

df$NEW_MEMBERS <- as.numeric(sub(" .*", "", df$HH_MEMBERS))
  • 原理:sub(" .*", "", x)会将字符串中第一个空格及后续所有内容替换为空,仅保留空格前的部分;as.numeric()将提取出的字符串转为数值类型。

方法2:使用stringr包提取数字

若习惯tidyverse生态,用stringr精准提取开头的数字:

library(stringr)
df$NEW_MEMBERS <- as.numeric(str_extract(df$HH_MEMBERS, "^\\d+"))
  • 原理:^\\d+是正则表达式,匹配字符串开头的一个或多个数字,直接提取目标内容后转数值。

方法3:用tidyr拆分列

通过separate直接拆分原列并自动转换类型:

library(tidyr)
df <- separate(df, HH_MEMBERS, into = c("NEW_MEMBERS", "Members"), sep = " ", convert = TRUE)
  • 原理:按空格拆分HH_MEMBERS为两列,convert = TRUE参数会自动识别数字并转为数值类型;若不需要拆分出的"Members"列,可后续用select(-Members)删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:35:06