表间模糊匹配后去除重复条目
Remove duplicate entries after fuzzy matching between tables
我正在尝试通过模糊匹配查找数据集名称和位置中的数据输入错误。我有一个来自原始数据的唯一密钥,siterow_id,并创建了一个新密钥,pi_key,我已经在其中确定了一些硬匹配。 (没有模糊匹配)。 运行 模糊匹配后我得到了重复值。一些 siterow_id 的连接左侧和右侧的匹配项。我可以手动查看数据并查看发生这种情况的位置,然后硬编码以删除行。当我转到具有更多匹配项的更大数据集时,我想要一种更具算法性的方法来执行此操作。
我试过这样做,但它删除了左侧和右侧的匹配项。如果可能的话,我会喜欢一种 tidyverse 的方式来做到这一点,而不是循环。
table 输出包含在下面。您可以在第 8 行和第 9 行中看到重复项。
for(site in three_letter_matches$siterow_id.x){
if (any(three_letter_matches$siterow_id.y == site)) {
three_letter_matches <- three_letter_matches[!three_letter_matches$siterow_id.y == site,]
}
}
pi_key.x siterow_id.x last_name.x first_name.x city.x country.x pi_key.y siterow_id.y
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 6309 1-9CH29M kim kevin san f~ united s~ 11870 1-HC3YY6
2 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-2QBRZ2
3 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-3AHHSU
4 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-3JYF8V
5 7567 1-CW4DXI bar jair ramat~ israel 8822 1-E3UILG
6 8822 1-E3UILG bar jair ramat~ israel 7567 1-CW4DXI
7 11870 1-HC3YY6 kim kevin san f~ united s~ 6309 1-9CH29M
8 12357 1-HUUEA6 lee hyojin daeje~ korea re~ 13460 1-IGKCPP
9 13460 1-IGKCPP lee hyo jin daeje~ korea re~ 12357 1-HUUEA6
我找到了另一种方法
update <- three_letter_matches[!is.na(match(three_letter_matches$siterow_id.x, three_letter_matches$siterow_id.y)),]
update %<>% arrange(last_name.x, first_name.x) %>%
filter(row_number() %% 2 != 0)
three_letter_matches_update <- three_letter_matches %>%
anti_join(update)
仍然愿意接受建议。
这不是最简单的问题,但有几种方法可以做到这一点。我想到的第一个有点慢(因为它使用 rowwise()
相当于使用 map()
或 lapply()
)是这个:
注意:这仅在 siterow_id.x/y 是字符向量时有效。不适用于因素。
three_letter_matches <- three_letter_matches %>%
rowwise() %>%
mutate(both_values = paste0(sort(c(siterow_id.x,siterow_id.y)),collapse = ",")) %>%
ungroup() %>%
distinct(both_values,.keep_all = TRUE) %>%
select(-both_values)
# pi_key.x siterow_id.x last_name.x first_name.x city.x country.x pi_key.y siterow_id.y
# 6309 1-9CH29M kim kevin san f~ united s~ 11870 1-HC3YY6
# 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-2QBRZ2
# 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-3AHHSU
# 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-3JYF8V
# 7567 1-CW4DXI bar jair ramat~ israel 8822 1-E3UILG
# 12357 1-HUUEA6 lee hyojin daeje~ korea re~ 13460 1-IGKCPP
基本上我在这里做的是按行进行,这样我一次处理一行,然后我获取 site_row ids 并对它们进行排序,这样每一行都有相同的顺序,然后我将它们粘贴到一个字符串中,这样很容易比较等价性。接下来,我取消分组,以便您再次查看所有行(按行删除)。然后 运行 不同,只保留新列中每个值的第一行,但使用 .keep_all 选项保留所有列。然后我通过删除多余的列进行清理。
我正在尝试通过模糊匹配查找数据集名称和位置中的数据输入错误。我有一个来自原始数据的唯一密钥,siterow_id,并创建了一个新密钥,pi_key,我已经在其中确定了一些硬匹配。 (没有模糊匹配)。 运行 模糊匹配后我得到了重复值。一些 siterow_id 的连接左侧和右侧的匹配项。我可以手动查看数据并查看发生这种情况的位置,然后硬编码以删除行。当我转到具有更多匹配项的更大数据集时,我想要一种更具算法性的方法来执行此操作。
我试过这样做,但它删除了左侧和右侧的匹配项。如果可能的话,我会喜欢一种 tidyverse 的方式来做到这一点,而不是循环。
table 输出包含在下面。您可以在第 8 行和第 9 行中看到重复项。
for(site in three_letter_matches$siterow_id.x){
if (any(three_letter_matches$siterow_id.y == site)) {
three_letter_matches <- three_letter_matches[!three_letter_matches$siterow_id.y == site,]
}
}
pi_key.x siterow_id.x last_name.x first_name.x city.x country.x pi_key.y siterow_id.y
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 6309 1-9CH29M kim kevin san f~ united s~ 11870 1-HC3YY6
2 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-2QBRZ2
3 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-3AHHSU
4 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-3JYF8V
5 7567 1-CW4DXI bar jair ramat~ israel 8822 1-E3UILG
6 8822 1-E3UILG bar jair ramat~ israel 7567 1-CW4DXI
7 11870 1-HC3YY6 kim kevin san f~ united s~ 6309 1-9CH29M
8 12357 1-HUUEA6 lee hyojin daeje~ korea re~ 13460 1-IGKCPP
9 13460 1-IGKCPP lee hyo jin daeje~ korea re~ 12357 1-HUUEA6
我找到了另一种方法
update <- three_letter_matches[!is.na(match(three_letter_matches$siterow_id.x, three_letter_matches$siterow_id.y)),]
update %<>% arrange(last_name.x, first_name.x) %>%
filter(row_number() %% 2 != 0)
three_letter_matches_update <- three_letter_matches %>%
anti_join(update)
仍然愿意接受建议。
这不是最简单的问题,但有几种方法可以做到这一点。我想到的第一个有点慢(因为它使用 rowwise()
相当于使用 map()
或 lapply()
)是这个:
注意:这仅在 siterow_id.x/y 是字符向量时有效。不适用于因素。
three_letter_matches <- three_letter_matches %>%
rowwise() %>%
mutate(both_values = paste0(sort(c(siterow_id.x,siterow_id.y)),collapse = ",")) %>%
ungroup() %>%
distinct(both_values,.keep_all = TRUE) %>%
select(-both_values)
# pi_key.x siterow_id.x last_name.x first_name.x city.x country.x pi_key.y siterow_id.y
# 6309 1-9CH29M kim kevin san f~ united s~ 11870 1-HC3YY6
# 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-2QBRZ2
# 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-3AHHSU
# 7198 1-CJGRSZ kim jinseok seoul korea re~ 2952 1-3JYF8V
# 7567 1-CW4DXI bar jair ramat~ israel 8822 1-E3UILG
# 12357 1-HUUEA6 lee hyojin daeje~ korea re~ 13460 1-IGKCPP
基本上我在这里做的是按行进行,这样我一次处理一行,然后我获取 site_row ids 并对它们进行排序,这样每一行都有相同的顺序,然后我将它们粘贴到一个字符串中,这样很容易比较等价性。接下来,我取消分组,以便您再次查看所有行(按行删除)。然后 运行 不同,只保留新列中每个值的第一行,但使用 .keep_all 选项保留所有列。然后我通过删除多余的列进行清理。