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