文本模糊匹配
通过文本距离
代码
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>
数值模糊匹配
单列
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
函数。
参数 :
x
和 y
:要连接的表。
by
:用于连接两个表的列。
max_dist
:用于连接的最大距离。
method
:计算距离的方法(选项包括 “haversine”(默认)、“geo”、“cosine”、“meeus”、“vincentysphere”、“vincentyellipsoid”)。
unit
:距离的单位(默认为 “miles”)。
mode
:连接类型(“inner”、“left”、“right”、“full”、“semi” 或 “anti”)。
distance_col
:如果给定,将添加一个名为该列的列,其中包含两者之间的地理距离。
...
:传递给距离方法的额外参数。
注意 :
默认方法是 “haversine”,因为在某些测试中它大致上是最快的。
注意,最慢的方法是 “vincentyellipsoid”,在模糊连接中只有在非常少的配对时才应使用,且精度至关重要。
如果你需要使用自定义的地理方法,可以直接使用 fuzzy_join
的 multi_by
和 multi_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
回到顶部