在一列中查找与其他几列相比唯一的字母,并将它们分段计算
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
我有点难以在 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