在一列中查找与其他几列相比唯一的字母,并将它们分段计算

Find letters in a column which are unique in comparison to several other columns and count them in segments

我有点难以在 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 上编写此代码的解决方案。有人可以提供帮助吗?

将 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