gpt4 book ai didi

R:搜索字符串 SIMILAR 并返回条件符号

转载 作者:行者123 更新时间:2023-12-05 00:37:48 27 4
gpt4 key购买 nike

我的 df 有以下条目:

A
xxx
xxx
xxx1
xx1x
yyyy
gggg

我想根据以下条件,根据 A 列的相似性将符号添加到我的 df 的 B 列。
  • 我将阈值设置为 = 或 > 75%
    相似的。
  • A 列已经排序。所以,
    检查上述 ONE 的相似性
    需要。
  • 如果上一个相似,则符号
    将从上面的 B 列复制。
  • 如果上面的不同,则
    将从同一行的 A 列复制符号。

  • 例如,第 1 行和第 2 行是相同的。它们的符号与 A 列相同。因为第 3 行是(4 个字母中的 3 个字母具有相同的字母和顺序)与第 1 行和第 2 行的相似度为 75%。它在 B 列中的 sybmol 将从上面的一个复制,即 xxx。由于 xx1x (row4) 是与 row3 相似的 4 个字母中的 2 个,因此它只会使用自己的符号,即 xx1x。由于 yyyy 和 gggg 完全不同,它们将保留自己的 sybmol,如 A 列中那样。

    因此,我的最终结果应该是这样的:
    A      B
    xxx xxx
    xxx xxx
    xxx1 xxx
    xx1x xx1x
    yyyy yyyy
    gggg gggg

    我通过猜测计算出这种相似性%(如果有用于字符串相似性搜索的正式方法,则不需要使用它),如果在 R 中有任何用于检查字符串相似性的正式方法,那么使用它可能会很好。

    你介意指导如何用 R 有效地添加这个符号列吗?

    最佳答案

    设置数据:

    x=c("xxx", "xxx", "xxx1", "xx1x", "yyyy", "gggg")

    编码:
    same <- sapply(seq(length(x)-1), 
    function(i)any(agrep(x[i+1], x[1], max.distance=0.25)))
    ex <- embed(x, 2)
    cbind(A=x, B=c(x[1], ifelse(same, ex[, 2], ex[, 1])))

    结果:
         A      B     
    [1,] "xxx" "xxx"
    [2,] "xxx" "xxx"
    [3,] "xxx1" "xxx"
    [4,] "xx1x" "xxx1"
    [5,] "yyyy" "yyyy"
    [6,] "gggg" "gggg"

    为什么有效?

    一些关键概念和真正有用的功能:

    首先, agrep使用 Levenshtein edit distance 测试字符串的相似程度,它有效地计算了将一个字符串转换为另一个字符串所需的单个字符更改的数量。参数 max.distance=0.25意味着允许 25% 的模式字符串不同。

    例如,测试是否有任何原始字符串类似于“xxx”:这将返回 1:4:
    agrep("xxx", x, max.distance=0.25)
    [1] 1 2 3 4

    其次, embed提供了一种测试滞后变量的有用方法。例如, embed(x, 2) turns x` 转换为滞后数组。这使得比较 x[1] 和 x[2] 变得很容易,因为它们现在位于数组中的同一行:
    embed(x, 2)
    [,1] [,2]
    [1,] "xxx" "xxx"
    [2,] "xxx1" "xxx"
    [3,] "xx1x" "xxx1"
    [4,] "yyyy" "xx1x"
    [5,] "gggg" "yyyy"

    最后,我使用 cbind和向量子集将原始向量和新向量拼接在一起。

    为了在数据框而不是向量上进行这项工作,我将代码转换为一个函数,如下所示:
    df <- data.frame(A=c("xxx", "xxx", "xxx1", "xx1x", "yyyy", "gggg"))

    f <- function(x){
    x <- as.vector(x)
    same <- sapply(seq(length(x)-1),
    function(i)any(agrep(x[i+1], x[1], max.distance=0.25)))
    ex <- embed(x, 2)
    c(x[1], ifelse(same, ex[, 2], ex[, 1]))
    }
    df$B <- f(df$A)
    df

    A B
    1 xxx xxx
    2 xxx xxx
    3 xxx1 xxx
    4 xx1x xxx1
    5 yyyy yyyy
    6 gggg gggg

    关于R:搜索字符串 SIMILAR 并返回条件符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524475/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com