2016-11-04 8 views
-1

Я хотел бы спросить вас, если есть подобная функция, как «соответствие» в первенствует в R.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  

Интересно, если есть функция, которая может помочь определить частично строки из вектора edu из первого столбца кадра данных МСКО, а затем, если есть совпадение, будет возвращен код (5, 6 или 7).

Я знаю, что есть такие функции, как «% like%» или «grepl», но я ищу что-то, что можно пропустить через все значения вектора edu, а не только одну определенную строку, определенную каждый раз.

Есть ли у кого-нибудь идеи? Или вы, ребята, предложите использовать цикл с «grepl»?

Спасибо!

+0

Что бы ожидаемый результат? –

+0

Если есть совпадение, возвращается значение «Код», а не весь столбец. – user95902

+0

Посмотрите на 'pmatch'. – lmo

ответ

0

В одну сторону, используется grep.

Создание вектора строк с paste0 и получение индекса везде, где он соответствует первому столбцу (Main_education_group). Используя этот индекс для извлечения соответствующего кадра Code из фрейма данных.

EDIT

Чтобы получить обновленный выход согласно запросу 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 
+0

Спасибо @Ronak! Однако у меня есть небольшая проблема таким образом, что я не смогу узнать, какие наблюдения относятся к 6 и 7? Может быть, я должен позволить вернуть НС? – user95902

+0

@ user95902 хорошо, так что вам нужен вывод, чтобы быть длиной 'edu'? Как и в этом случае, выход должен быть «6 NA 7 NA» –

+0

Да, точно! – user95902