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
.
中不存在的子字符串
我试图在 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
.