R:如何通过仅比较每个字符串中的前 3 个制表符分隔项来对两个字符串向量使用 setdiff?不使用 qdap

R: How to use setdiff on two string vectors by only comparing the first 3 tab delimited items in each string? without using qdap

我之前问过这个问题,我收到的答案有效:, 然而,qdap 需要 rJava 和正确的用户系统设置。cannot load R package qdap。所以现在我重新问这个问题,但想知道是否有办法在不使用 qdap 的情况下做到这一点?我将重复下面的问题:

我试图在 R 中找出一种方法来计算两个字符串向量的差异,但仅基于每个字符串中制表符分隔的前 3 列。例如,这是 list1 和 list2

列表 1:

 "1\t1113200\t1118399\t1\t1101465\t1120176\tENSRNOG00000040300\tRaet1l\t0\n" 
        "1\t1180200\t1187599\t1\t1177682\t1221416\tENSRNOG00000061316\tAABR07000121.1\t0\n"
        "1\t1180200\t1187599\t1\t1177632\t1221416\tENSRNOG00000061316\tAABR07000121.1\t0\n"

列表 2:

"1\t1113200\t1118399\t1\t1101465\t1120176\tENSRNOG00000040300\tRaet1l\t0\n" 
  "1\t1180200\t1187599\t1\t1177682\t1221416\tENSRNOG00000061316\tAABR07000121.1\t0\n"

我想执行 setdiff(list2,list1) ,这样我就可以得到 list2 中不存在于 list1 中的所有内容,但是我想仅基于前 3 个制表符分隔的字符串来执行此操作。所以在 list1 中我只会考虑:

  "1\t1113200\t1118399"

从第一个条目开始。但是我仍然希望返回完整的字符串。我只想使用前 3 列进行比较。我无法弄清楚如何执行此操作,我们将不胜感激。我已经看过几篇 SO 帖子,其中 none 似乎有所帮助。

看起来您只需要从 list1 中提取第三个制表符(以获取前三列)并将其与 list2?

中的相同内容进行比较

在 base R 中有很多方法可以做到这一点,这里是使用正则表达式提取前三个选项卡的方法:

# first, let's get the first 3 columns of `list1` (get up to the third tab)
m = regexec("^(?:[^\t]+\t){3}", list1)
# you'll see it's a list with the first 3 columns of each thing in `x`
first3.list1 = unlist(regmatches(list1, m))

现在我们有了可以与 list2 匹配的前三列。您可以类似地提取 list2 的前三列,然后像现在对上一个问题的答案一样使用 %in% 。 (setdiff只会return不匹配的前3列,而使用%in%可以用来索引原始的list2来提取整个原始字符串)

m = regexec("^(?:[^\t]+\t){3}", list2)
first3.list2 = unlist(regmatches(list2, m))
list2[!(first3.list2 %in% first3.list1)]

(在你提供的例子中,list2中没有前三列不在list1前三列的行)。


其他方法包括使用 strsplitread.delim 将您的数据框拆分为多列,然后使用 paste 将前 3 列重新粘贴在一起,然后进行类似的操作。