如何在R语言中按条件从数据框文本列解析数字至新列?
R语言按条件解析文本中的数字到指定列
需求:在数据框中,仅对满足grepl("apple", df$col1)条件的行,从col1的文本字符串里提取数字并赋值到col3列;不满足条件(包括col1为NA)的行,col3设为NA。
示例数据:
col1 <- c("I have 1 apple", NA, "I have 2 apples", NA, "I have 3 apples", NA, "I have 4 apples") col2 <- c(7:13) df <- as.data.frame(cbind(col1, col2)) df$col3 <- NA
解决方案
方法1:基础R实现
直接用ifelse判断条件,结合readr::parse_number提取数字:
library(readr) # 筛选含apple的行,仅对这些行解析数字,其余设为NA df$col3 <- ifelse(grepl("apple", df$col1, na.rm = TRUE), parse_number(df$col1), NA)
grepl中设置na.rm = TRUE,会把col1为NA的行判定为不满足条件,对应col3设为NA,符合需求。
方法2:dplyr风格实现
如果习惯用tidyverse语法,用dplyr::if_else(要求分支类型严格一致):
library(dplyr) library(readr) df <- df %>% mutate(col3 = if_else(grepl("apple", col1, na.rm = TRUE), parse_number(col1), as.numeric(NA)))
这里需要把NA转为数值型,保证if_else两个分支的类型统一。
关于lapply的说明
readr::parse_number本身是向量化函数,可以直接对整个列操作,不需要搭配lapply循环处理每行。强行用lapply反而会增加代码复杂度,不如直接用向量化写法简洁高效。
运行后df$col3的结果为:1, NA, 2, NA, 3, NA, 4,完全符合预期。
内容的提问来源于stack exchange,提问作者Abbey A.
相关产品推荐
相关产品推荐

