#r #dplyr
Вопрос:
Я все еще новичок в stackoverflow и dplyr. Возможно, именно поэтому я не смог найти ни одного другого подобного вопроса.
Проблема: У меня есть два df.
df1 содержит переменную («a»), записи которой я хочу сравнить с записями переменной в df2 («c»). Обе переменные являются символами.
Если у меня есть совпадение между обоими dfs, я хочу добавить строку в новый столбец («новый»), Который содержит строку df1 («бирн» и т. Д.).
Однако длина каждой записи отличается между обеими переменными. Так что, возможно, str_detect или ends_with должны быть полезны.
##DFs df1 lt;-data.frame("a"= c("055","022","010","0105","0777","077"), "b"= c("birne", "apfel", "banane","traube","blaubeere","kiwi")) df2 lt;-data.frame("c"= c("GX00000055","GX0000022","GX00000010","GX00000105","GX0000777","GX0000077")) ## I want df2_newcolumnlt;-data.frame("c"= c("GX00000055","GX0000022","GX00000010","GX00000105","GX0000777","GX0000077"), "new"=c("birne", "apfel","NA","NA","blaubeere","NA"))
Я думал, что смогу получить его, используя left_join и фильтр в сочетании с ends_with, grepl или str_detect. Тем не менее, я изо всех сил старался подобрать правильную комбинацию и порядок команд.
Комментарии:
1. Если ответ @Wimpel не решит ваш вопрос, я думаю, вам нужно (а) исправить ваши данные, чтобы они были согласованными, и/или (б) объяснить, как они
NA
определяются.
Ответ №1:
Я не могу воспроизвести желаемый результат (что там есть?), Но соединение с регулярным выражением может быть тем, что вам нужно:
library(tidyverse) library(fuzzyjoin) df2 %gt;% regex_left_join(df1 %gt;% mutate(regex = paste0(a, "$")), by = c(c = "regex")) %gt;% # c a b regex # 1 GX00000055 055 birne 055$ # 2 GX0000022 022 apfel 022$ # 3 GX00000010 010 banane 010$ # 4 GX00000105 0105 traube 0105$ # 5 GX0000777 0777 blaubeere 0777$ # 6 GX0000077 077 kiwi 077$ select(c,b) # c b # 1 GX00000055 birne # 2 GX0000022 apfel # 3 GX00000010 banane # 4 GX00000105 traube # 5 GX0000777 blaubeere # 6 GX0000077 kiwi
Комментарии:
1. Спасибо @Wimpel! Ваше предложение звучит хорошо. Я попытался найти больше на regex_left_join, потому что я еще не смог перенести ваше решение на мои реальные данные. Мне придется провести здесь еще несколько исследований, чтобы понять, что не работает. И на этой ноте я надеюсь, что скоро смогу предоставить новый пример данных. Спасибо за ваше терпение. Я был бы благодарен, если бы вы снова смогли мне помочь. br