在R中通过模糊字符串匹配和分组摘要创建新变量的有效方法

在R中通过模糊字符串匹配和分组摘要创建新变量的有效方法,r,dplyr,group-by,fuzzy-search,R,Dplyr,Group By,Fuzzy Search,我尝试使用模糊字符串匹配将字符串转换为特定ID,并使用dplyr执行分组摘要。其基本思想是通过字典查找方法将不完美的基因序列组合成单个基因名称,并计算基因被检测到的次数。这样,序列aaaaaa和aaaxaa的计数与gene1匹配并相加 我可以使用for和if语句,通过对原始数据与字典进行逐行比较,来实现我想要的功能,但我发现,当我放大时,这会变得效率低下(原始数据文件平均有15k行,字典有200行)。请看下面我的解决方案,我正在努力改进,如果你能想出一种更高效、更优雅的方法,请告诉我 df st

我尝试使用模糊字符串匹配将字符串转换为特定ID,并使用dplyr执行分组摘要。其基本思想是通过字典查找方法将不完美的基因序列组合成单个基因名称,并计算基因被检测到的次数。这样,序列
aaaaaa
aaaxaa
的计数与
gene1
匹配并相加

我可以使用
for
if
语句,通过对原始数据与字典进行逐行比较,来实现我想要的功能,但我发现,当我放大时,这会变得效率低下(原始数据文件平均有15k行,字典有200行)。请看下面我的解决方案,我正在努力改进,如果你能想出一种更高效、更优雅的方法,请告诉我

df str\u var grp\u var num\u var
#>1 AAAAA grp1 1
#>2 aXaaaa grp1 2
#>3 BBBBGRP1 1
#>4 bbbXbb grp1 2
#>5 AAAAA grp1 1
#>6 aXaaaa grp1 2
#>7 BBBB grp2 1
#>8 bbbXbb grp2 2
#>9 AAAAA grp2 1
#>10 aXaaaa grp2 2
#>11 BBBB grp2 1
#>12 bbbXbb grp2 2
字典字符串id
#>1 AAAAA基因1
#>2 bbbbbb基因2
#>3中交3
#>4 DDDD基因4
适用于(i/1:nrow(df)){
for(j in 1:nrow(字典)){
match_发现'summary()'已按'grp_var'将输出分组。您可以使用'.groups'参数重写。
新德里
#>#tibble:4 x 3
#>#组:grp#U变量[2]
#>grp\u var基因\u id基因\u计数
#>              
#>1 grp1基因1 6
#>2 grp1基因2 3
#>3 grp2基因1 3
#>4 grp2基因2 6

由(v2.0.0)于2021-06-08创建的也许
模糊连接会更容易

library(fuzzyjoin)
stringdist_left_join(df, dictionary, by = c("str_var" = "string")) %>% 
     group_by(grp_var, gene_id = id) %>% 
     summarise(gene_count = sum(num_var), .groups = 'drop')
-输出

# A tibble: 4 x 3
  grp_var gene_id gene_count
  <chr>   <chr>        <dbl>
1 grp1    gene1            6
2 grp1    gene2            3
3 grp2    gene1            3
4 grp2    gene2            6
#一个tible:4 x 3
grp\u var基因\u id基因\u计数
1 grp1基因1 6
2 grp1基因2 3
3 grp2基因1 3
4 grp2基因2 6

数据听起来足够小,您可以进行笛卡尔连接以获得15k x 200=3M行数据集,然后筛选最佳匹配。天哪!这太漂亮了!我的意思是哇!如果我有更大的数据帧和字典,这还会有效吗?我想可能是
数据。表
就地编辑方法可能更有效icient,但我可能错了。@Atakan我还没有在大数据上进行测试,但它应该比你的测试更快loop@Atakan使用
stringdist\u left\u join
,默认情况下有
method
的选项,我认为它正在选择
osa
,您可以将该方法与
max\u dist
一起更改,以获得一些放松ma的方法修改规则。
method=c(“osa”、“lv”、“dl”、“hamming”、“lcs”、“qgram”、“cosine”、“jaccard”、“jw”、“soundex”)
@Atakan此外,您还可以使用
regex\u left\u join
match\u fuzzy\u left\u join
作为
str\u detect模糊左join(df,dictionary,by=c(“str\u var=“string”),match\u fun=str\u detect)%%>%fill(id)%%>%group\u by(grp\u var,gene\u id=id)%%>%summary(gene\u count=sum(num\u var),.groups='drop')
同样有效