R语言fuzzyjoin包模糊匹配

R语言
数据清洗
fuzzyjoin包是R语言中用于模糊匹配和连接数据集的包。它提供了一组函数,可以根据模糊条件(如相似度、距离等)来连接两个数据集,从而允许用户在数据集中进行更灵活的连接操作。
作者

不止BI

发布于

2024年5月13日

文本模糊匹配

通过文本距离

代码
library(dplyr)
library(fuzzyjoin)

df1 <- tribble(~"word1", "苹果", "香蕉", "橙子", "苹果香蕉")
df2 <- tribble(~"word2", "苹果", "果苹", "苹果子", "蕉", "橙", "橙红")
df1 %>%
  stringdist_join(df2,
    method = "osa",
    mode = "left",
    by = c(word1 = "word2"),
    max_dist = 1, distance_col = "dist_osa"
  )
# A tibble: 7 × 3
  word1    word2  dist_osa
  <chr>    <chr>     <dbl>
1 苹果     苹果          0
2 苹果     果苹          1
3 苹果     苹果子        1
4 香蕉     蕉            1
5 橙子     橙            1
6 橙子     橙红          1
7 苹果香蕉 <NA>         NA
代码
df1 %>%
  stringdist_join(df2,
    method = "lv",
    mode = "left",
    by = c(word1 = "word2"),
    max_dist = 1, distance_col = "dist_lv"
  )
# A tibble: 6 × 3
  word1    word2  dist_lv
  <chr>    <chr>    <dbl>
1 苹果     苹果         0
2 苹果     苹果子       1
3 香蕉     蕉           1
4 橙子     橙           1
5 橙子     橙红         1
6 苹果香蕉 <NA>        NA

fuzzyjoin包中最常用的函数是fuzzy_join()函数,它可以根据指定的模糊条件(如相似度阈值)来连接两个数据集。用户可以选择不同的连接类型(如左连接、右连接、内连接等)来满足不同的需求。

  • by为连接的列

  • max_dist为最大距离阈值

  • method为计算距离的方法:

    • osa: Optimal String Alignment,最优字符串对齐,计算两个字符串之间的编辑距离,允许插入、删除和替换操作。osa算法会考虑字符串之间的相对位置。

    • lv: Levenshtein distance,莱文斯坦距离,计算两个字符串之间的编辑距离,允许插入、删除和替换操作。Levenshtein距离是一种通用的编辑距离算法,不考虑字符的相对位置。

    • dl: Damerau-Levenshtein distance,达马劳-莱文斯坦距离,计算两个字符串之间的编辑距离,允许插入、删除、替换和相邻字符交换操作。

    • hamming: Hamming distance,汉明距离,计算两个等长字符串对应位置不同字符的个数,要求两个字符串长度相同。

    • lcs: Longest Common Subsequence,最长公共子序列,计算两个字符串之间的最长公共子序列的长度。

    • qgram: Q-gram distance,Q-gram距离,计算两个字符串之间的Q-gram相似度。

    • cosine: Cosine distance,余弦距离,计算两个字符串之间的余弦相似度。

    • jaccard: Jaccard distance,Jaccard距离,计算两个字符串之间的Jaccard相似度。

    • jw: Jaro-Winkler distance,Jaro-Winkler距离,计算两个字符串之间的Jaro-Winkler相似度。

    • soundex: Soundex distance,Soundex距离,计算两个字符串之间的Soundex编码的相似度。

  • mode 为连接模式

  • ignore_case 表示是否忽略大小写

  • distance_col 为距离列的名称

通过正则匹配

regex_join 函数允许你基于一个表中的正则表达式列来连接另一个表中的字符串列。具体而言,它允许你根据正则表达式匹配来连接两个表。

代码
library(dplyr)
library(ggplot2)
data(diamonds)

diamonds <- tbl_df(diamonds)

d <- data_frame(
  regex_name = c("^Idea", "mium", "Good"),
  type = 1:3
)


diamonds %>%
  regex_inner_join(d, by = c(cut = "regex_name"))
# A tibble: 52,330 × 12
   carat cut       color clarity depth table price     x     y     z regex_name
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr>     
 1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43 ^Idea     
 2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31 mium      
 3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31 Good      
 4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63 mium      
 5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75 Good      
 6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48 Good      
 7  0.24 Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47 Good      
 8  0.26 Very Good H     SI1      61.9    55   337  4.07  4.11  2.53 Good      
 9  0.23 Very Good H     VS1      59.4    61   338  4     4.05  2.39 Good      
10  0.3  Good      J     SI1      64      55   339  4.25  4.28  2.73 Good      
# ℹ 52,320 more rows
# ℹ 1 more variable: type <int>
  • 参数

    • xy:要连接的表。

    • by:用于连接两个表的列。

    • mode:连接类型(“inner”、“left”、“right”、“full”、“semi” 或 “anti”)。

    • ignore_case:是否忽略大小写(默认为否)。

数值模糊匹配

单列

difference_join 函数是一个用于根据两个表格之间列的绝对差异来进行连接操作的函数。下面是该函数的一些重要参数和功能的解释:

  • x:第一个表格(tbl)。

  • y:第二个表格(tbl)。

  • by:指定用于连接两个表格的列。

  • max_dist:最大允许的差异值,超过这个值的行将不会被连接。

  • mode:连接模式,可以是 “inner”、“left”、“right”、“full”、“semi” 或 “anti”,分别表示内连接、左连接、右连接、全连接、半连接和反连接。

  • distance_col:如果指定了这个参数,将会添加一个包含差异值的列到连接后的结果中。

根据用户指定的参数,difference_join 函数会根据两个表格之间指定列的绝对差异来进行连接,并返回连接后的结果。

代码
library(dplyr)

sepal_lengths <- data_frame(Sepal.Length = c(5, 6, 7), Type = 1:3)
iris %>%
  difference_join(sepal_lengths, max_dist = .5, distance_col = "dist") %>%
  head(10)
   Sepal.Length.x Sepal.Width Petal.Length Petal.Width Species Sepal.Length.y
1             5.1         3.5          1.4         0.2  setosa              5
2             4.9         3.0          1.4         0.2  setosa              5
3             4.7         3.2          1.3         0.2  setosa              5
4             4.6         3.1          1.5         0.2  setosa              5
5             5.0         3.6          1.4         0.2  setosa              5
6             5.4         3.9          1.7         0.4  setosa              5
7             4.6         3.4          1.4         0.3  setosa              5
8             5.0         3.4          1.5         0.2  setosa              5
9             4.9         3.1          1.5         0.1  setosa              5
10            5.4         3.7          1.5         0.2  setosa              5
   Type dist
1     1  0.1
2     1  0.1
3     1  0.3
4     1  0.4
5     1  0.0
6     1  0.4
7     1  0.4
8     1  0.0
9     1  0.1
10    1  0.4

多列

distance_join 函数是 fuzzyjoin 包中的一个用于基于一个或多个列的距离度量来连接两个表格的函数。以下是该函数的一些重要参数和功能的解释:

  • x:第一个表格(tbl)。

  • y:第二个表格(tbl)。

  • by:指定用于连接两个表格的列。

  • max_dist:最大允许的距离值,超过这个值的行将不会被连接。

  • method:计算距离的方法,可以选择 “euclidean”(默认值)或 “manhattan”。

  • mode:连接模式,可以是 “inner”、“left”、“right”、“full”、“semi” 或 “anti”,分别表示内连接、左连接、右连接、全连接、半连接和反连接。

  • distance_col:如果指定了这个参数,将会添加一个包含距禧值的列到连接后的结果中。

distance_join 函数与 difference_join 的区别在于它在计算距离时考虑了所有列,而不仅仅是单个列。这使得它可以使用依赖于多个列的度量方法,例如欧几里得距离或曼哈顿距离

曼哈顿距离

曼哈顿距离(Manhattan distance): 曼哈顿距离是另一种常用的距离度量方法,也称为城市街区距离。在二维空间中,两点之间的曼哈顿距离可以通过横纵坐标之间的绝对差值之和来计算。在多维空间中,曼哈顿距离的计算公式为: \[Manhattan distance = |x_1 - x_2|+|y_1-y_2|+...+|z_1-z_2|\]

曼哈顿距离得名于纽约曼哈顿的街道规划,因为在曼哈顿岛的街道上行走只能沿着直角转弯的路径。曼哈顿距离越小,表示两个点之间需要经过的路径越短。

代码
sepal_lengths <- data_frame(
  Sepal.Length = c(5, 6, 7),
  Sepal.Width = 1:3
)

iris %>%
  distance_inner_join(sepal_lengths, method = "euclidean", max_dist = 2) %>%
  head(10)
   Sepal.Length.x Sepal.Width.x Petal.Length Petal.Width Species Sepal.Length.y
1             5.1           3.5          1.4         0.2  setosa              6
2             5.1           3.5          1.4         0.2  setosa              7
3             4.9           3.0          1.4         0.2  setosa              6
4             4.7           3.2          1.3         0.2  setosa              6
5             4.6           3.1          1.5         0.2  setosa              6
6             5.0           3.6          1.4         0.2  setosa              6
7             5.4           3.9          1.7         0.4  setosa              6
8             5.4           3.9          1.7         0.4  setosa              7
9             4.6           3.4          1.4         0.3  setosa              6
10            5.0           3.4          1.5         0.2  setosa              6
   Sepal.Width.y
1              2
2              3
3              2
4              2
5              2
6              2
7              2
8              3
9              2
10             2

坐标模糊匹配

geo_join 函数允许你基于经度和纬度的地理距离来连接两个表。具体而言,它允许根据经度和纬度的组合进行连接。如果你使用的距离度量不是基于经度和纬度的,那么你应该使用 distance_join 函数。

  • 参数

    • xy:要连接的表。

    • by:用于连接两个表的列。

    • max_dist:用于连接的最大距离。

    • method:计算距离的方法(选项包括 “haversine”(默认)、“geo”、“cosine”、“meeus”、“vincentysphere”、“vincentyellipsoid”)。

    • unit:距离的单位(默认为 “miles”)。

    • mode:连接类型(“inner”、“left”、“right”、“full”、“semi” 或 “anti”)。

    • distance_col:如果给定,将添加一个名为该列的列,其中包含两者之间的地理距离。

    • ...:传递给距离方法的额外参数。

  • 注意

    • 默认方法是 “haversine”,因为在某些测试中它大致上是最快的。

    • 注意,最慢的方法是 “vincentyellipsoid”,在模糊连接中只有在非常少的配对时才应使用,且精度至关重要。

    • 如果你需要使用自定义的地理方法,可以直接使用 fuzzy_joinmulti_bymulti_match_fun 参数来编写它。

代码
library(dplyr)
data("state")

states <- data_frame(
  state = state.name,
  longitude = state.center$x,
  latitude = state.center$y
)

s1 <- rename(states, state1 = state)
s2 <- rename(states, state2 = state)

pairs <- s1 %>%
  geo_inner_join(s2, max_dist = 200, distance_col = "dist") %>%
  filter(state1 != state2)
pairs
# A tibble: 74 × 7
   state1      longitude.x latitude.x state2        longitude.y latitude.y  dist
   <chr>             <dbl>      <dbl> <chr>               <dbl>      <dbl> <dbl>
 1 Alabama           -86.8       32.6 Georgia             -83.4       32.3 198. 
 2 Alabama           -86.8       32.6 Mississippi         -89.8       32.7 178. 
 3 Connecticut       -72.4       41.6 Massachusetts       -71.6       42.4  66.7
 4 Connecticut       -72.4       41.6 New Hampshire       -71.4       43.4 134. 
 5 Connecticut       -72.4       41.6 New Jersey          -74.2       40.0 150. 
 6 Connecticut       -72.4       41.6 New York            -75.1       43.1 178. 
 7 Connecticut       -72.4       41.6 Rhode Island        -71.1       41.6  63.8
 8 Connecticut       -72.4       41.6 Vermont             -72.5       44.3 184. 
 9 Delaware          -75.0       38.7 Maryland            -76.6       39.3  98.5
10 Delaware          -75.0       38.7 New Jersey          -74.2       40.0  97.6
# ℹ 64 more rows

基因模糊匹配

genome_join 函数是 fuzzyjoin 包中用于基于重叠的基因组区间连接两个表格的函数。它是 interval_join 的扩展,专门用于处理基因组区间数据。基因组区间包括染色体ID和区间范围,只有当染色体ID匹配且区间有重叠时才被认为是匹配的。在使用 genome_join 函数时,by 参数必须包含三个元素,并且按照顺序为 c("chromosome", "start", "end")

参数说明:

  • x:第一个表格。

  • y:第二个表格。

  • by:连接列的名称,必须按照顺序为 c("chromosome", "start", "end")

  • mode:连接模式,可以是 “inner”、“left”、“right”、“full”、“semi” 或 “anti”。

通过 genome_join 函数,您可以方便地基于基因组区间进行连接操作,以便更好地分析基因组数据。

代码
library(dplyr)

x1 <- tibble(
  id1 = 1:4,
  chromosome = c("chr1", "chr1", "chr2", "chr2"),
  start = c(100, 200, 300, 400),
  end = c(150, 250, 350, 450)
)

x2 <- tibble(
  id2 = 1:4,
  chromosome = c("chr1", "chr2", "chr2", "chr1"),
  start = c(140, 210, 400, 300),
  end = c(160, 240, 415, 320)
)

requireNamespace("IRanges", quietly = TRUE)
genome_inner_join(x1, x2, by = c("chromosome", "start", "end"))
# A tibble: 2 × 8
    id1 chromosome.x start.x end.x   id2 chromosome.y start.y end.y
  <int> <chr>          <dbl> <dbl> <int> <chr>          <dbl> <dbl>
1     1 chr1             100   150     1 chr1             140   160
2     4 chr2             400   450     3 chr2             400   415
回到顶部