我有一个数据帧,其中包含一个列,其中包含一些自由 Select 的"代码"(例如"abcde"、"blabla").由于数据来自在线调查,有时用户会错误地输入他们应该输入的代码.例如,他们写的是"bacde"而不是"abcde".

library(RecordLinkage)
library(tidyverse)

# Sample data
df <- data.frame(code = c(rep("abcde", 20), "bbcde", "abccde", rep("efghi", 20), "efigh", "efghj"))

我编写了一个函数correctCodes(),它返回"更正"的代码.它使用levenshtein距离来计算两个字符串之间的相似度.只有当至少有两个"参考代码"并且相似度超过某个阈值(.8)时,代码才会被更正

# function that calculates similarity between two strings
mylevsim = function (str1, str2) {
  return(1 - (RecordLinkage::levenshteinDist(str1, str2)/max(nchar(str1), nchar(str2))))
}


# Function that returns the corrected code
correctCodes <- function(wrongCode) {

  wrongCode <- trimws(toupper(wrongCode))
  
  counts <- df %>% 
    mutate(code = trimws(toupper(code))) %>%
    group_by(code) %>%
    summarise(n = n(),
              Var2 = code,
              code = NULL) %>%
    filter(!duplicated(code))
  
expand.grid(trimws(toupper(df$code)), trimws(toupper(df$code)), stringsAsFactors = FALSE) %>%
    mutate(similarity = mylevsim(Var1, Var2)) %>%
    arrange(Var1, desc(similarity)) %>%
    left_join(counts, by = "Var2") %>%
    mutate(both = paste(Var1, Var2)) %>%
    filter(!duplicated(both),
           Var1 != Var2,
           Var1 == wrongCode,
           n > 2,
           similarity > .8) %>%
     filter(row_number()==1) %>%
     pull(Var2)
} 

现在,如果我像这样调用函数(该函数返回"ABCDE"),就可以很好地工作:

correctCodes("abccde")  # returns ABCDE
correctCodes("bbcde")   # returns ABCDE
correctCodes("efghj")   # returns EFGHI

然而,如果我想在dplyr::mutate()以内使用它,它根本不起作用:

df %>%
  mutate(code_corrected = correctCodes(code))

推荐答案

您需要将函数矢量化:

vectorized_correctCodes <- Vectorize(correctCodes)


df %>%
  mutate(code_corrected = vectorized_correctCodes(code))

     code code_corrected
1   abcde               
2   abcde               
3   abcde               
4   abcde               
5   abcde               
6   abcde               
7   abcde               
8   abcde               
9   abcde               
10  abcde               
11  abcde               
12  abcde               
13  abcde               
14  abcde               
15  abcde               
16  abcde               
17  abcde               
18  abcde               
19  abcde               
20  abcde               
21  bbcde          ABCDE
22 abccde          ABCDE
23  efghi               
24  efghi               
25  efghi               
26  efghi               
27  efghi               
28  efghi               
29  efghi               
30  efghi               
31  efghi               
32  efghi               
33  efghi               
34  efghi               
35  efghi               
36  efghi               
37  efghi               
38  efghi               
39  efghi               
40  efghi               
41  efghi               
42  efghi               
43  efigh               
44  efghj          EFGHI

R相关问答推荐

如果窗口在CLARME或集团之外,则有条件领先/滞后滚动总和返回NA

如果索引重复,聚合xts核心数据

具有多个依赖变量/LHS的逻辑模型

次级y轴R gggplot2

根据模式将一列拆分为多列,并在R中进行拆分

使用ggsankey调整Sankey图中单个 node 上的标签

如何使用STAT_SUMMARY向ggplot2中的密度图添加垂直线

R函数‘paste`正在颠倒其参数的顺序

R中的时间序列(Ts)函数计数不正确

如何使用ggplot对堆叠条形图进行嵌套排序?

2个Rscript.exe可执行文件有什么区别?

`lazy_dt`不支持`dplyr/across`?

如何通过匹配R中所有可能的组合来从宽到长旋转多个列?

安全地测试文件是否通过R打开

将全局环境变量的名称分配给列表中的所有元素

当每个变量值只能 Select 一次时,如何从数据框中 Select 两个变量的组合?

多元正态分布的计算

在r中整理图例和堆叠图的问题

将某个阈值以下的列中的值分类到不同的列中,否则保持该列的原样

在一个multiplot中以非对称的方式在R中绘制多个图