如何使用dplyr从DataFrame字符串列的特定短语后提取目标数字
实现方案
你可以通过正则匹配捕获目标数字,无需固定截取字符长度,适配所有位数的温度、以及风向位置不固定的风速提取场景,配合dplyr的mutate即可完成需求。
核心代码
不需要额外依赖的base R正则版本:
library(dplyr) df <- df %>% mutate( # 提取Temp:后第一组连续数字作为温度,自动适配1/2/3位数值 temperature = as.integer(sub(".*Temp: (\\d+).*", "\\1", weather)), # 跳过Wind:后所有非数字内容,提取第一组连续数字作为风速 wind_speed = as.integer(sub(".*Wind:.*?(\\d+).*", "\\1", weather)) )
如果你习惯使用stringr包的函数,也可以用str_extract实现:
library(dplyr) library(stringr) df <- df %>% mutate( temperature = as.integer(str_extract(weather, "(?<=Temp: )\\d+")), wind_speed = as.integer(str_extract(weather, "Wind:.*?(\\d+)", group = 1)) )
逻辑说明
- 温度提取的正则
.*Temp: (\\d+).*中,(\\d+)会捕获Temp:之后的第一串连续数字,不受数值位数影响 - 风速提取的正则
.*Wind:.*?(\\d+).*中,.*?是非贪婪匹配,会自动跳过Wind:和数值之间的所有内容(包括空格、风向字符),无论风向在数值前还是后都能正确提取风速
测试验证
用你提供的样例数据测试,输出结果如下:
| weather | temperature | wind_speed |
|---|---|---|
| Sunny Temp: 78 F, Humidity: 63%, Wind: SSW 6 mph | 78 | 6 |
| Sunny Temp: 103 F, Humidity: 7%, Wind: 16 SW mph | 103 | 16 |
| Temp: 88 F, Humidity: 43%, Wind: S 12 mph | 88 | 12 |
| Cloudy Temp: 81 F, Humidity: 90%, Wind: SW 5 mph | 81 | 5 |
内容的提问来源于stack exchange,提问作者ChazC
相关产品推荐
相关产品推荐

