r语言 - 如何将case_when(mapply (adist, x, y) <= 3 ~ x, TRUE ~ y)) 应用于不同长度和顺序的列



嗨,我已经尝试了一段时间来匹配两大列的名称,其中几个具有不同的拼写等……到目前为止,我已经编写了一些代码来在较小的数据集上练习

examples%>% mutate(new_ID = case_when(mapply (adist, example_1 , example_2) <= 3 ~ example_1, TRUE ~ example_2))

如果距离编辑距离小于3,则可以创建一个新列,其名称与示例1中的名称相同。然而,如果它不符合我需要它做的这个标准,它就不会给出示例2中的名称

这段代码也只适用于每列的相邻行,而我需要它来处理有两列的数据集(其中一列更大,所以不能按相同的顺序排列(。

还需要不尝试匹配较小名称列中的NA(在那里填写与另一列相同的长度(。

有人知道怎么做这样的事吗?

dput(head(examples))
structure(list(. = structure(c(4L, 3L, 2L, 1L, 5L), .Label = c("grarryfieldsred","harroldfrankknight", "sandramaymeres", "sheilaovensnew", "terrifrank"), class = "factor"), example_2 = structure(c(4L, 2L, 3L, 1L, 
5L), .Label = c(" grarryfieldsred", "candramymars", "haroldfranrinight", 
"sheilowansknew", "terryfrenk"), class = "factor")), row.names = c(NA, 
5L), class = "data.frame")

问题是您的列已成为因子而不是字符向量。当您尝试将具有不同因子级别的两列组合在一起时,可能会出现意外的结果。

首先将列转换为字符:

library(dplyr)
examples %>%
mutate(across(contains("example"),as.character)) %>%
mutate(new_ID =  case_when(mapply (adist, example_1 , example_2) <= 3 ~ example_1,
TRUE ~ example_2))
#           example_1         example_2             new_ID
#1     sheilaovensnew    sheilowansknew     sheilowansknew
#2     sandramaymeres      candramymars       candramymars
#3 harroldfrankknight haroldfranrinight harroldfrankknight
#4    grarryfieldsred   grarryfieldsred    grarryfieldsred
#5         terrifrank        terryfrenk         terrifrank

在您的dput输出中,不知何故example_1的名称发生了更改。我先运行了这个:

names(examples)[1] <- "example_1"

最新更新