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

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

我试图在 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 似乎有所帮助。

为了提取前三列(不确定为什么需要将其作为长字符串而不是数据框...),我会使用 qdap 库中的 beg2char()。 (不过,如果它们的长度都相同,base substr() 就可以正常工作。)

beg2char(list1, '\t', 3) # Will extract from the beginning up to the third tab delimiter

然后而不是 setdiff 我会简单地使用 %in% 来检查 list2 中元素的子字符串是否与 list1 中的任何元素匹配。

beg2char(list2, '\t', 3) %in% beg2char(list1, '\t', 3) # will give you TRUE/FALSE
list2[!(beg2char(list2, '\t', 3) %in% beg2char(list1, '\t', 3))]

将给出 list2 的完整元素,其中包含 list1.

中不存在的子字符串