【问题标题】:Partial String Matching by Row按行匹配部分字符串
【发布时间】:2017-04-02 15:34:55
【问题描述】:

我正在尝试在数据框中创建一个唯一列,该列在两个字符串的 left 侧的两个字符串之间具有字符匹配的数字。

每一行代表都有一个比较字符串,我们希望将其用作针对用户给定字符串的测试。给定一个数据框:

df <- data.frame(x=c("yhf", "rnmqjk", "wok"), y=c("yh", "rnmj", "ok"))

       x    y
1    yhf   yh
2 rnmqjk rnmj
3    wok   ok

其中 x 是我们的比较字符串,y 是我们给定的字符串,我希望在 z 列中输出“2, 3, 0”的值,如下所示:

       x    y    z
1    yhf   yh    2
2 rnmqjk rnmj    3
3    wok   ok    0

本质上,我希望根据比较字符串 (x) 从左 -> 右检查给定的字符串 (y),并且当字符不对齐时不检查字符串的其余部分并记录比赛号码。

提前谢谢你!

【问题讨论】:

    标签: r string dataframe string-matching


    【解决方案1】:

    此代码适用于您的示例:

    df$z <- mapply(function(x, y) which.max(x != y),
                   strsplit(as.character(df$x), split=""),
                   strsplit(as.character(df$y), split="")) - 1
    
    df
           x    y z
    1    yhf   yh 2
    2 rnmqjk rnmj 3
    3    wok   ok 0
    

    作为大纲,strsplit 将字符串向量拆分为字符向量列表。在这里,向量的每个元素都是一个字符(带有 split="" 参数)。 which.max 函数返回第一个位置,它的参数是向量的最大值。由于x != y 返回的向量是逻辑的,which.max 返回观察到差异的第一个位置。 mapply 接受一个函数和列表,并将提供的函数应用于列表的相应元素。

    请注意,这会产生字符串长度不匹配的警告。这可以通过多种方式解决,最简单的方法是将函数包装在 suppressWarnings 中,如果消息让您感到厌烦。


    正如 OP 所指出的,如果存在整个单词匹配的实例,则 which.max 返回 1。要返回与字符串相同的长度,我将添加第二行代码,将逻辑子集与nchar 函数:

    df$z[as.character(df$x) == as.character(df$y)] <-
                            nchar(as.character(df$x[as.character(df$x) == as.character(df$y)]))
    

    【讨论】:

    • 嘿 lmo,感谢您帮助我解决这个问题。我注意到当字符串完全匹配时,您创建的函数返回“0”(因为没有 x != y 的实例)。您对如何修改代码有什么建议,以便当 x=y 时返回比较字符串的字符串长度?
    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2019-10-18
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多