【问题标题】:R Partial string match and returns a value from the matched row (like "match" in excel)R 部分字符串匹配并从匹配的行中返回一个值(如 excel 中的“匹配”)
【发布时间】:2026-01-13 05:10:01
【问题描述】:

想请教一下R中的excel中是否有类似“匹配”的功能。

例如,如果我有一个包含人们教育程度的数据集:

> edu
chr [1:4] "Bachelor" "NA" "Master" "Superieur" 

ISCED 的国际地图系统:

> ISCED
 Main education program                      English translation                   Code
 Brevet d'enseignement supérieur (BES)       certificate of higher education        5
 bachelier de transition                     Bachelor                               6
 Bachelor                                    Bachelor                               6
 Master                                      Master                                 7       

我想知道是否有一个函数可以帮助识别来自数据帧 ISCED 第一列的向量 edu 中的部分字符串,然后如果匹配,将返回代码(5、6 或 7) .

我知道有像“%like%”或“grepl”这样的函数,但我正在寻找可以浏览向量 edu 的所有值的东西,而不仅仅是每次定义的一个特定字符串。

有人有什么见解吗?或者你们会建议使用带有“grepl”的循环吗?

谢谢!

【问题讨论】:

  • 预期的结果是什么?
  • 如果匹配,则返回“代码”的值,而不是整个列。
  • 看看pmatch
  • 您想部分匹配它们,对吗?而不是完全匹配。
  • 是的,只是部分匹配,因为数据源不一样,所以很难完全匹配。

标签: r string-matching grepl


【解决方案1】:

一种方法是使用grep

paste0 制作一个字符串向量,并在它与第一列(Main_education_group)匹配的地方获取索引。使用该索引从数据框中获取相应的Code

ISCED$Code[grep(paste0(edu, collapse = "|"), ISCED$Main_education_program)]

#[1] 6 7

编辑

要根据 OP 的请求获取更新的输出,我们可以使用 sapply 并循环遍历 edu 中的任何元素,并检查 Main_education_program 中是否存在该元素

sapply(edu, function(x) if(length(grep(x, ISCED$Main_education_program)) > 0) 
                         ISCED$Code[grep(x, ISCED$Main_education_program)] else NA)

返回

#  Bachelor        NA    Master  Superieur 
#        6         NA         7        NA 

如果我们需要它而不需要名称,我们可以将其包装在 unname

unname(sapply(edu, function(x) if(length(grep(x, ISCED$Main_education_program))>0) 
                  ISCED$Code[grep(x, ISCED$Main_education_program)] else NA ))

#[1]  6 NA  7 NA

【讨论】:

  • 感谢@Ronak!但是我有一个小问题,这样我就无法知道 6 和 7 指的是哪些观察结果?也许我应该让 NA 也被退回?
  • @user95902 好的,所以您需要输出长度为 edu 吗?就像在这种情况下输出应该是6 NA 7 NA
  • 非常感谢。真的很感激。事实上,输入向量 'edu' 比列出的 4 个示例要复杂得多,而且我发现 'grep' 或 'grepl' 也不能很好地与 '|' 配合使用'()' 在模式中。
  • 我想投票赞成你的回答,但我没有足够的重复...对不起,伙计
最近更新 更多