R加入tolower
R join by 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
加入?
为什么不创建一个 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
如果你不想改变原来的 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
我有一些示例数据
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
加入?
为什么不创建一个 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
如果你不想改变原来的 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