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

R语言:提取数据框邮箱并添加至v2列相邻位置的实现问题

解决方案:提取邮箱并添加到数据框中

嘿,你的正则表达式用来提取邮箱是完全没问题的!现在只需要把提取到的结果作为新列加入数据框,并且处理那些没有匹配到邮箱的行(自动填充NA),就能达到你想要的效果。下面分两种方法给你演示:

方法1:用基础R实现(无需额外包)

你的regmatches+regexpr组合已经能提取到匹配的邮箱,但它会跳过没有匹配的行,所以我们需要把结果转换成和数据框行数一致的向量,没有匹配的位置填NA:

# 原始数据
v1 <- c("I will try to fix you usman@usman.com", "I will try to fix you", "Zombies Zombies xyz@ymail.com")
v2 <- c("ABC", "XYZ", "Oh Game")
dx <- data.frame(v1, v2)

# 提取邮箱并处理无匹配的情况
dx$email <- sapply(regmatches(dx$v1, regexpr("[[:alnum:]]+\\@[[:alpha:]]+\\.com", dx$v1)), 
                   function(x) ifelse(length(x) == 0, NA_character_, x))

# 生成你需要的v2+邮箱组合文本
dx$combined <- paste(dx$v2, dx$email)
print(dx$combined)

运行后会输出:

[1] "ABC usman@usman.com" "XYZ NA"              "Oh Game xyz@ymail.com"

方法2:用stringr包更简洁实现

stringr包的str_extract函数会自动给没有匹配到的行返回NA,代码更易读:

library(stringr)

# 提取邮箱作为新列
dx$email <- str_extract(dx$v1, "[[:alnum:]]+\\@[[:alpha:]]+\\.com")

# 生成组合文本
dx$combined <- paste(dx$v2, dx$email)
print(dx$combined)

这个方法和上面的结果完全一致,而且代码更简洁。

如果你想直接查看v2和邮箱的对应关系,直接打印数据框dx也能清晰看到:

print(dx)

输出:

v1      v2             email
1 I will try to fix you usman@usman.com     ABC usman@usman.com
2                I will try to fix you     XYZ              <NA>
3        Zombies Zombies xyz@ymail.com Oh Game   xyz@ymail.com

这样就完美实现了你想要的效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:03:02