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

行式调用str_split_1失败:如何实现无数据重塑的邮箱匹配?

问题描述

我有一个数据框,包含两列字符型数据,每列的元素都是用逗号分隔的邮箱地址字符串。需要拆分第一列的字符串生成邮箱向量,检查其中是否有任意邮箱存在于第二列对应的行中,要求单次调用完成,不进行数据重塑。

数据示例

df <- structure(list(a = c("a@test.com, b@test.com", "x@test.com, y@test.com"),
                     b = c("b@test.com, c@test.com", "d@test.com, e@test.com")),
                class = "data.frame",
                row.names = c(NA, -2L))

尝试的错误代码

df |>
  mutate(test = any(str_detect(a, str_split_1(b, ", "))))

报错信息:

Error in `mutate()`:
ℹ In argument: `test = any(str_detect(a, str_split_1(b, ", ")))`.
Caused by error in `str_split_1()`:
! `string` must be a single string, not a character vector.
Run `rlang::last_trace()` to see where the error occurred.

问题出在str_split_1只能处理单个字符串,无法直接对整列向量逐行处理,且any是全局判断,不是逐行判断。

期望输出

a                      b  test
1 a@test.com, b@test.com b@test.com, c@test.com  TRUE
2 x@test.com, y@test.com d@test.com, e@test.com FALSE

解决方法

方法1:用purrr::map2逐行配对处理

利用map2_lgl对每行的a和b进行配对操作,拆分后检查邮箱交集:

library(dplyr)
library(purrr)
library(stringr)

df |>
  mutate(test = map2_lgl(a, b, ~{
    a_emails <- str_split_1(.x, ", ")
    b_emails <- str_split_1(.y, ", ")
    any(a_emails %in% b_emails)
  }))

方法2:rowwise()分组处理

先按行分组,再对每行的邮箱拆分后判断:

df |>
  rowwise() |>
  mutate(test = any(str_split_1(a, ", ") %in% str_split_1(b, ", "))) |>
  ungroup()

方法3:向量化正则匹配(最简洁)

把每行b列的邮箱列表转成用|分隔的正则表达式,直接用str_detect检查a列是否包含匹配项,无需拆分操作:

df |>
  mutate(test = str_detect(a, str_replace_all(b, ", ", "|")))

这种方法完全符合“单次调用、不重塑数据”的要求,代码最简洁。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:20:17