匹配两个字符串向量,不考虑元素名称的顺序

Matching two string vectors disregarding the order of the element names

提问人:Simon Harmel 提问时间:9/24/2023 最后编辑:bobble bubbleSimon Harmel 更新时间:9/25/2023 访问量:48

问:

下面,我想要两个字符串向量:我的向量和我的向量,如下所示:match()firstsecond1

( desired_output = match(first, second1) ) #> [1] 4 5 1 6 2 3

但是我的向量可以有相反的两部分字符串元素,例如而不是像我的向量中所示那样。second1"perf.acog""acog.perf"second2

问题:我们能产生与实际产量相同的输出吗?match(first, second2)match(first, second1)

注意:由两部分组成的字符串元素可以通过其中定义的任何分隔符连接,例如(例如)、(例如)等。因此,一般/功能性答案是值得赞赏的。"[^[:alnum:]]+"".""perf.acog""_""perf_acog"

first = c("asom.acog", "conf.acog", "perf.acog", "conf.asom", "perf.asom", 
          "perf.conf")

second1 = c("perf.acog", "perf.asom", "perf.conf", "asom.acog", "conf.acog", 
           "conf.asom")

second2 = c("acog.perf", "asom.perf", "conf.perf", "acog.asom", "acog.conf", 
            "asom.conf")
R 正则表达式 字符串 向量 函数编程

评论


答:

1赞 Andre Wildberg 9/24/2023 #1

在字符串上使用非单词字符。revstrsplit\\W

编辑:在分隔符泛化中还包括“第一”,以便在两个字符串都可以有任何非字符分隔符的情况下启用匹配。

match(sub("\\W", "", first), lapply(strsplit(second2, "\\W"), 
    \(x) paste(rev(x), collapse="")))
[1] 4 5 1 6 2 3

测试:

identical(
  match(first, second1), 
  match(sub("\\W", "", first), lapply(strsplit(second2, "\\W"), 
    \(x) paste(rev(x), collapse=""))))
[1] TRUE

评论

0赞 Andre Wildberg 9/25/2023
@SimonHarmel我专注于“secondX”,请参阅编辑“first”是否也可能包含不同的分隔符。