R由tolower

时间:2018-04-26 10:33:08

标签: r join tolower

我有一些示例数据

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)

我想加入,但是“cat”和“Cat”应视为相同的值。我想过使用tolower并首先确定

出现在两个数据框中的条目
in_both = data1[(tolower(data1$name) %in% tolower(data2$name)),]

然后我想加入data2,但这不起作用,因为名称不匹配。

library(dplyr)
left_join(in_both, data2)

使用tolower是否有办法加入?

2 个答案:

答案 0 :(得分:1)

为什么不创建一个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

答案 1 :(得分:0)

如果您不想更改原始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