В R, как я могу применить VLOOKUP, если столбец идентификатора присутствует, но не имеет отношения к другому?

#r #join #vlookup

#r #Присоединиться #vlookup

Вопрос:

Здесь есть много связанных вопросов об этой проблеме, в частности , об использовании left_join from dplyr , но я все еще не могу понять этого.

Все, что я хочу сделать, это вернуться LanguageClean на Lookup основе совпадения со Language столбцом в df . Если совпадения нет, просто вернитесь NA . Я хочу LanguageClean добавить в качестве новой колонки df .

Я вижу , что мой приведенный ниже код повторяет ID , но я этого не хочу. ID Столбец не имеет значения для моих целей здесь, хотя мне нужно сохранить его в конечном кадре данных.

 df lt;- structure(list(ID = structure(c(18L, 89L, 42L, 161L, 88L, 71L,   175L, 181L, 133L, 56L, 18L, 89L, 42L, 161L, 88L, 71L, 175L, 181L,   133L, 56L, 18L, 89L, 42L, 161L, 88L, 71L, 175L, 181L, 133L, 56L ), .Dim = c(10L, 3L)), Language = c("en", "", "lv", "en", "en",   "de", "en", "ms", "", "en"), Geo = c("us", "", "-", "us",   "us", "gb", "ca", "us", "-", "us")), class = "data.frame", row.names = c(NA,   -10L))   lookup lt;- structure(list(Language = c("af", "ar", "ar", "ar", "ar", "ar",   "ar", "ar", "ar", "eu", "be", "zh", "zh", "hr", "da", "nl", "en",   "en", "en", "en", "en", "en", "fo", "fi", "fr", "fr", "gd", "de",   "de", "de", "he", "hu", "id", "it", "ko", "lv", "mk", "mt", "no",   "pt", "rm", "ro", "ru", "sr", "sk", "sb", "es", "es", "es", "es",   "es", "es", "es", "es", "es", "sx", "sv", "ts", "tr", "ur", "vi",   "ji", "sq", "ar", "ar", "ar", "ar", "ar", "ar", "ar", "ar", "bg",   "ca", "zh", "zh", "cs", "nl", "en", "en", "en", "en", "en", "en",   "et", "fa", "fr", "fr", "fr", "ga", "de", "de", "el", "hi", "is",   "it", "ja", "ko", "lt", "ms", "no", "pl", "pt", "ro", "ru", "sz",   "sr", "sl", "es", "es", "es", "es", "es", "es", "es", "es", "es",   "es", "sv", "th", "tn", "uk", "ve", "xh", "zu"), LanguageClean = c("Afrikaans",   "Arabic", "Arabic", "Arabic", "Arabic", "Arabic", "Arabic", "Arabic",   "Arabic", "Basque", "Belarusian", "Chinese", "Chinese", "Croatian",   "Danish", "Dutch", "English", "English", "English", "English",   "English", "English", "Faeroese", "Finnish", "French", "French",   "Gaelic", "German", "German", "German", "Hebrew", "Hungarian",   "Indonesian", "Italian", "Korean", "Latvian", "Macedonian", "Maltese",   "Norwegian", "Portuguese", "Rhaeto-Romanic", "Romanian", "Russian",   "Serbian", "Slovak", "Sorbian", "Spanish", "Spanish", "Spanish",   "Spanish", "Spanish", "Spanish", "Spanish", "Spanish", "Spanish",   "Sutu", "Swedish", "Tsonga", "Turkish", "Urdu", "Vietnamese",   "Yiddish", "Albanian", "Arabic", "Arabic", "Arabic", "Arabic",   "Arabic", "Arabic", "Arabic", "Arabic", "Bulgarian", "Catalan",   "Chinese", "Chinese", "Czech", "Dutch", "English", "English",   "English", "English", "English", "English", "Estonian", "Farsi",   "French", "French", "French", "Irish", "German", "German", "Greek",   "Hindi", "Icelandic", "Italian", "Japanese", "Korean", "Lithuanian",   "Malaysian", "Norwegian", "Polish", "Portuguese", "Romanian",   "Russian", "Sami", "Serbian", "Slovenian", "Spanish", "Spanish",   "Spanish", "Spanish", "Spanish", "Spanish", "Spanish", "Spanish",   "Spanish", "Spanish", "Swedish", "Thai", "Tswana", "Ukrainian",   "Venda", "Xhosa", "Zulu")), class = "data.frame", row.names = c(NA,   -124L))  df lt;- left_join(df, lookup, by="Language")  

Ответ №1:

Проблема в том, что таблица поиска содержит несколько записей для некоторых языков. Следовательно, вы в конечном итоге получаете несколько совпадений. Поэтому решите свою проблему, чтобы вы могли отфильтровать различные или уникальные комбинации из своего поиска с помощью dplyr::distinct :

 library(dplyr)  df lt;- left_join(df, distinct(lookup, Language, LanguageClean), by = "Language") df #gt; ID.1 ID.2 ID.3 Language Geo LanguageClean #gt; 1 18 18 18 en us English #gt; 2 89 89 89 lt;NAgt; #gt; 3 42 42 42 lv - Latvian #gt; 4 161 161 161 en us English #gt; 5 88 88 88 en us English #gt; 6 71 71 71 de gb German #gt; 7 175 175 175 en ca English #gt; 8 181 181 181 ms us Malaysian #gt; 9 133 133 133 - lt;NAgt; #gt; 10 56 56 56 en us English