【问题标题】:Find letters in a column which are unique in comparison to several other columns and count them in segments查找与其他几列相比唯一的列中的字母,并将它们分段计数
【发布时间】:2019-08-28 11:27:31
【问题描述】:

在 R 上编写脚本来处理数据集以获取另一个程序的输入文件时,我有点吃力。

我有一个如下所示的数据集:

df1 <- read.table(text = "
chr  pos ind0 ind1 ind2 ind3 ind4 ind5 ind6 ind7 ind8 ind9 ind10
MRVK01001299.1 972    C    C    T    N    C    C    T    N    N    C     C
MRVK01001299.1 973    G    G    G    N    G    G    G    N    N    G     G
MRVK01001299.1 997    C    T    T    T    T    T    T    T    T    T     T
MRVK01001299.1 999    A    T    T    N    T    T    T    T    T    T     T
MRVK01001299.1 1018   A    C    T    N    T    C    C    T    T    T     T
MRVK01001299.1 1086   A    T    T    T    T    T    T    T    T    T     T
MRVK01001299.1 2125   C    C    T    N    C    C    T    N    N    C     C
MRVK01001299.1 2456   G    G    G    N    G    G    G    N    N    G     G
", header = TRUE, stringsAsFactors = FALSE)

我想确定在 ind0 中唯一找到字母的位置 (pos)。

“N”不会被算作不同的字母。例如,我们将为位置 997、999 和 1086 设置一个唯一值。

然后,我想数一下 ind0 有多少次在 position (pos) 列中有 1000 个系列的私人信件。 所以这将是:

0 2 
1000 1
2000 0
etc

因为我们有两个位置,ind0 的唯一值介于 0 和 1000 之间,1 介于 1000 和 2000 之间,0 介于 2000 和 3000 之间。最远的值将超过 20,000,000。

我正在努力寻找在 R 上对此进行编码的解决方案。有人可以帮忙吗?

【问题讨论】:

  • 如果我们对数据有更多了解,可能会更容易回答,生物学问题是什么,预期的输出含义是什么?添加了一些标签,希望有“海豚”数据的用户有所了解。
  • 在您包含的表格(或表格的子集)上使用dput(),并将结果发布在此处。这允许我们复制您的表格。
  • @hedgedandlevered 使数据可重现。
  • 非常感谢您的帮助。数据是在每个个体中发现的支架、位置和等位基因(A、T、C、G、N)。我正在将一个特定的个体 (ind01) 与另一个个体进行比较,看看他是否有私人等位基因簇。如果是这样,这可能表明他的祖先来自我们没有抽样的人群(幽灵人群)。个体是海豚,chrm 和 pos 列表示宽吻海豚参考基因组中的位置。
  • 这是我数据集前 8 行(共 43,500 行)的 dput() 结果,用于前 3 个人(有 22 个人):

标签: r bioinformatics genetics


【解决方案1】:

将 ind0 的值与其他个体和子集进行比较:

res1 <- df1[ rowSums(df1$ind0 == df1[, -c(1:3)]) == 0 &
                       apply(df1[, -c(1:3)], 1, function(i) length(unique(i[ i != "N" ]))) == 1, ]

res1
#              chr  pos ind0 ind1 ind2 ind3 ind4 ind5 ind6 ind7 ind8 ind9 ind10
# 3 MRVK01001299.1  997    C    T    T    T    T    T    T    T    T    T     T
# 4 MRVK01001299.1  999    A    T    T    N    T    T    T    T    T    T     T
# 6 MRVK01001299.1 1086    A    T    T    T    T    T    T    T    T    T     T

然后我们可以使用 table 获取每个块的计数:

table(cut(res1$pos, c(0, 1000, 2000, 3000)))
# (0,1e+03] (1e+03,2e+03] (2e+03,3e+03] 
#         2             1             0

【讨论】:

  • 非常感谢您的快速回复。我试过了,但我得到了以下我还没有设法解决的错误。 df1$ind0 == df1[, -c(1:3)] 中的错误:未实现这些类型的比较此外:警告消息:1:在 is.data.frame(x) 中:不兼容的方法(“Ops. factor", "Ops.data.frame") for "==" 2: In df1$ind0 == df1[, -c(1:3)] : 较长的对象长度不是较短对象长度的倍数
  • 另外,我希望不包括第 1018 行,因为有些人的字母不同。但是 999 将被包括在内,因为另一个人的唯一不同字母是 N。抱歉,我没有提到 N 意味着该人在该位置缺少数据。
  • @mariels17 错误,因为 ind 列是因素,将它们更改为字符或在导入 R 时设置 stringsAsFactors = FALSE
  • @mariels17 编辑了帖子,现在结果不包括 1018。
  • @zx87754 再次感谢您的帮助。不幸的是,似乎只有位置计数的输入文件是不够的,我还想打印私有等位基因的位置。所以输出看起来像: 0 2 997,999 1000 1 1086 2000 0 等 我一直试图在论坛上找到解决方案,但没有找到任何相关的东西。你或任何人能提供帮助吗?非常感谢
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多