gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:37:24 25 4
gpt4 key购买 nike

我以前问过这个问题,我收到的答案有效:R: How to use setdiff on two string vectors by only comparing the first 3 tab delimited items in each string? ,
然而,qdap 需要 rJava 和正确的用户系统设置。 cannot load R package qdap .所以现在我重新提出这个问题,但我想知道是否有办法在不使用 qdap 的情况下做到这一点?我将重复以下问题:

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

list 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"

list 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 帖子,但似乎没有一个有帮助。

最佳答案

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

在基础 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 将只返回不匹配的前 3 列,而使用 %in% 可用于索引原始 list2 以提取整个原始字符串)
m = regexec("^(?:[^\t]+\t){3}", list2)
first3.list2 = unlist(regmatches(list2, m))
list2[!(first3.list2 %in% first3.list1)]

(似乎对于您提供的示例, list2 中没有前 3 列不在 list1 的前 3 列中的行)。

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

关于R:如何通过仅比较每个字符串中的前 3 个制表符分隔项来对两个字符串向量使用 setdiff?不使用 qdap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39735934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com