【问题标题】:R - How to compare two words sentence if order is not same?R - 如果顺序不同,如何比较两个单词?
【发布时间】:2016-12-19 02:00:44
【问题描述】:

举个例子

z <- "Dikesh Faldu"
y <- "Faldu Dikesh"

我想处理这两个变量并给我与“DikeshFaldu”相同的输出

让我们再举一个例子

我有一个具有所有这些值的变量,例如

[1] dikesh faldu
[2] xyz abc
[3] faldu dikesh
[4] anything like
[5] but only
[6] two words
[7] only but

…………

然后我想要像

这样的输出
[1] dikeshfaldu
[2] xyzabc
[3] dikeshfaldu
[4] anythinglike
[5] butonly
[6] twowords
[7] butonly

[1] faldudikesh
[2] xyzabc
[3] faldudikesh
[4] anythinglike
[5] onlybut
[6] twowords
[7] onlybut

【问题讨论】:

  • stringsplit,然后排序,然后将它们粘贴在一起。如果顺序无关紧要,这是有效的:NameSurname 或 SurnameName
  • 该评论确实是答案。您可能应该这样发布它!
  • @RonakShah - strsplit 是矢量化的。不需要内循环。 lapply(strsplit(c(z, y), " "), function(x) paste(sort(x), collapse=""))。可能会在上面做Reduce(identical, ...) 以完成'er off。
  • @DirtySockSniffer 如何在其中传递列表? strsplit 不接受列表。
  • 使用字符向量,而不是列表。

标签: r string-comparison


【解决方案1】:

根据@zx8754、@Dirty Sock Sniffer 和@RHertel 的输入,你可以试试,

sapply(strsplit(charvec, " "), function(x) paste(sort(x), collapse=""))

#[1] "dikeshfaldu"  "abcxyz"       "dikeshfaldu"  "anythinglike" "butonly"     
#[6] "twowords"     "butonly" 

在哪里

charvec <- c("dikesh faldu", "xyz abc", "faldu dikesh", "anything like", 
              "but only", "two words", "only but")

【讨论】:

    【解决方案2】:

    对于第一种情况,匹配一个或多个空格(\\s+)并将其替换为sub中的""

    sub("\\s+", "", z)
    #[1] "DikeshFaldu"
    

    对于第二种情况,将非空白区域捕获为一个组并重新排列反向引用。

    sub("(\\S+)\\s+(\\S+)", "\\2\\1", y)
    #[1] "DikeshFaldu"
    

    如果sort是按字母顺序排列的,那么我们使用stringi中的stri_extract提取单词,sort it和paste一起使用

    library(stringi)
    vapply(stri_extract_all(c(z,y), regex = "\\w+"), function(x)
                paste(sort(x), collapse=""), character(1))
    #[1] "DikeshFaldu" "DikeshFaldu"
    

    在 OP 的帖子中使用更新后的向量

    vapply(stri_extract_all(charvec, regex = "\\w+"), 
           function(x) paste(sort(x), collapse=""), character(1))
    #[1] "dikeshfaldu"  "abcxyz"       "dikeshfaldu"  "anythinglike" 
    #[5] "butonly"      "twowords"     "butonly" 
    

    数据

    charvec <- c("dikesh faldu", "xyz abc", "faldu dikesh", "anything like", 
               "but only", "two words", "only but")
    

    【讨论】:

    • 说明显而易见,但是您现在需要提前处理您正在处理的场景。我对旧数据的经验是你不这样做,因为它是如此不一致:-(
    • @Jasper OP 没有提到它需要以哪种方式排序。
    【解决方案3】:

    这是您要查找的 R 代码。与zx8754 提到的相同。

    z <- "Dikesh Faldu"
    y <- "Faldu Dikesh"
    
    sort(unlist(strsplit(z,split=' '))) == sort(unlist(strsplit(y,split=' ')))
    
    [1] TRUE TRUE
    

    【讨论】:

    • 您忘记将拆分的字符串重新粘贴在一起。这就是为什么有两个“TRUE”输出。也许改用这个:reorderedNames &lt;- function(x) paste(sort(unlist(strsplit(x, split=' '))), collapse = ''); identical(reorderedNames(z), reorderedNames(y))
    • 我认为你的答案应该是一个标记的答案:) 你为什么不添加它?
    • @DikeshFaldu 使用我第一条评论中描述的功能,您可以尝试:theNames &lt;- c("dikesh faldu", "xyz abc", "faldu dikesh", "anything like", "but only", "two words", "only but"); unname(sapply(theNames, reorderedNames))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多