R部分字符串匹配并从匹配的行返回一个值(如excel中的“match”)

时间:2016-11-04 11:21:27

标签: r string-matching grepl

我想问你是否在R中的excel中有类似“匹配”的功能。

例如,如果我有一个包含人员教育学位的数据集:

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

国际成人教育区的国际测绘系统:

> 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”这样的函数,但我正在寻找可以浏览vector edu的所有值而不是每次都定义一个特定字符串的东西。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

一种方法是使用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 < / p>

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