如何解决我可以在2列之间的范围内识别相同的值吗?
我正在尝试比较两个不同列之间的值,但是我需要它接受±3范围内的值。
我创建了这2个小贴士:
example_tp1 <- tibble(Object_centre = c(84,149,489,534,680.5))
example_tp2 <- tibble(Object_centre = c(84.5,149.5,528.5,542,680.5))
我希望程序链接在±3范围内相同的链接。 例如,我希望它确定84和84.5相同,也分别为149和149.5; 489和489; 680.5和680.5。但是我也想告诉我534、528.5和542没有匹配项。
有什么办法吗?
解决方法
这可以通过fuzzyjoin
包来实现,例如:
library(dplyr)
library(fuzzyjoin)
example_tp1 <- tibble(Object_centre = c(84,149,489,534,680.5))
example_tp2 <- tibble(Object_centre = c(84.5,149.5,528.5,542,680.5))
match_fun1 <- function(x,y) {
# (x >= y - 3) & (x <= y + 3)
# or following the suggestion by @DarrenTsai
abs(x - y) <= 3
}
fuzzy_full_join(example_tp1,example_tp2,by = c("Object_centre"),match_fun = match_fun1)
#> # A tibble: 7 x 2
#> Object_centre.x Object_centre.y
#> <dbl> <dbl>
#> 1 84 84.5
#> 2 149 150.
#> 3 489 489
#> 4 680. 680.
#> 5 534 NA
#> 6 NA 528.
#> 7 NA 542
由reprex package(v0.3.0)于2020-08-22创建
,您可以查看值的所有组合,并查看匹配的值。
# Data Frame of all combinations
example <- expand.grid(c(84,680.5),c(84.5,680.5))
# Assigns a Match if the values are within a range of 3
example %>%
mutate(match = ifelse(abs(Var1-Var2) <= 3,"Match","No Match"))
Var1 Var2 match
1 84.0 84.5 Match
2 149.0 84.5 No Match
3 489.0 84.5 No Match
4 534.0 84.5 No Match
5 680.5 84.5 No Match
6 84.0 149.5 No Match
7 149.0 149.5 Match
8 489.0 149.5 No Match
9 ..... ..... ........
10 ..... ..... ........
and so on
然后您可以仅过滤出匹配项,或者查看哪些值不匹配。
,类似于@Jumble使用tidyverse
函数的答案:
tidyr::crossing(example_tp1,.name_repair = ~c('col1','col2')) %>%
dplyr::filter(abs(col1 - col2) <= 3)
# col1 col2
# <dbl> <dbl>
#1 84 84.5
#2 149 150.
#3 489 489
#4 680. 680.
crossing
生成example_tp1
和example_tp2
的所有组合,我们仅保留差异小于等于3的那些行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。