У меня есть образцы данных
data1 = data.frame(name = c("cat", "dog", "parrot"), freq = c(1,2,3))
data2 = data.frame(name = c("Cat", "snake", "Dog", freq2 = c(2,3,4)))
data1$name = as.character(data1$name)
data2$name = as.character(data2$name)
к которому я хочу присоединиться, но, например, «кошка» и «кошка» следует рассматривать как одно и то же значение. Я подумал об использовании tolower и сначала определил записи, которые появляются в обоих фреймах данных,
in_both = data1[(tolower(data1$name) %in% tolower(data2$name)),]
Затем я хочу присоединиться к data2, но это не работает, потому что имена не совпадают.
library(dplyr)
left_join(in_both, data2)
Есть ли способ присоединиться с помощью tolower?





Почему бы не создать функцию dplyr, которая бы понижала имя левого data.frame и выполняла слияние.
С помощью настраиваемой функции вы получите больше контроля, и вам не придется повторять много шагов.
f_dplyr <- function(left,right){
left$name <- tolower(left$name)
inner_join(left,right,by = "name")
}
f_dplyr(data2, data1)
Результат
name freq2 freq
cat 2 1
dog 4 2
Это надежно, но есть одна потенциальная проблема, связанная с тем, что вы можете захотеть сохранить некоторые нестрочные значения в столбце, к которому вы присоединяетесь. Вы можете захотеть, чтобы окончательный вывод столбца name был Cat и Dog.
Если вы не хотите изменять исходный data2, как предложил @AshofFire, вы можете декапитализировать значения в name в канале %>%, а затем выполнить операцию соединения:
data2 %>%
mutate(name = str_to_lower(name)) %>%
inner_join(data1, by = "name")
name freq2 freq
1 cat 2 1
2 dog 4 2
Почему бы не очистить
data2перед выполнением соединения? напримерdata2$name <- tolower(data2$name)иmerge(data,data2,by = "name", all.x = T)?