首页 > 解决方案 > 查找与其他几列相比唯一的列中的字母,并将它们分段计数

问题描述

我有点努力在 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 有多少次在位置 (pos) 列中有 1000 个系列的私人信件。所以这将是:

0 2 
1000 1
2000 0
etc

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

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

标签: rbioinformaticsgenetics

解决方案


将 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

推荐阅读