R 在一列中查找与其他几列相比唯一的字母,按段进行计数并打印其位置
我试图为Skov方法准备一个输入文件,以查看海豚种群中的幽灵祖先 我有一个如下所示的数据集:R 在一列中查找与其他几列相比唯一的字母,按段进行计数并打印其位置,r,R,我试图为Skov方法准备一个输入文件,以查看海豚种群中的幽灵祖先 我有一个如下所示的数据集: 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
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
数据是支架、位置,然后是在每个个体中发现的等位基因(A、T、C、G、N)。我将一个特定的个体(ind0)与其他个体进行比较,看看他是否有私人等位基因簇。如果是这样的话,这可能表明他来自我们没有取样的群体(幽灵群体)。chrm和pos列表示宽吻海豚参考基因组中的位置
这是对我的数据集的前8行(共43500行)前3个个体(共22个个体)的dput()
的结果:
请注意,上表是一个包含私有等位基因的示例,但第一行不包含任何等位基因
我想确定在ind0
中唯一找到字母的位置(pos
)。“N”不会被视为不同的字母。例如,位置997、999和1086有一个唯一的值
然后,我想计算一下有多少次ind0
在position(pos
)列中有一个1000个私人字母的序列。并打印每个箱子的私有等位基因位置。因此这将是(需要输出文件):
因为我们有两个位置(位置997999),其中ind0的唯一值在0和1000之间,1在1000和2000之间(位置1086),0在2000和3000之间。最大值将超过20000000
@zx87754提供了下面的代码,我想添加“print
”私有等位基因的位置。我没有在论坛上找到帮助,除了打印或awk功能可能在这里有所帮助
确定哪些SNPsind0
有一个私有等位基因-“N”不作为缺失数据计算为不同的等位基因:
res1 <- df1[ rowSums(df1$ind0 == df1 [, -c(1:3)]) == 0 &
apply(df1 [, -c(1:3)], 1, function(i) length(unique(i[ i != "N" ]))) == 1, ]
Count the number of positions with a private allele for ind0 in bins of 1000 bp:
res2<-table(cut(res1$pos, c(seq(0, 23092000, by=1000))))
res1#数据
种子(42)
d=数据帧(chr=“A”,
位置=1:20,
ind0=样本(x=c(“A”、“c”、“T”、“G”、“N”),
尺寸=20,
replace=TRUE,
prob=c(.24、.24、.24、.24、.04)))
d$ind1=d$ind0
d$ind1[样本(1:20,5)]=样本(x=c(“A”、“c”、“T”、“G”、“N”),
尺寸=5,
replace=TRUE,
prob=c(.24、.24、.24、.24、.04))
d$ind2=d$ind1
#将列ind1子集到末尾,并获得每行的唯一值
所有行=应用(X=d[!colnames(d)%in%c(“chr”、“pos”、“ind0”)],
保证金=1,
乐趣=功能(x){
if(长度(唯一(x))==1&x[1]!=“N”){
x[1]
}否则{
NA
}
})
#标识ind0与所有_行不同的行索引
inds=其中(d[,“ind0”!=所有行都是.na(d[,“ind0”]))
#使用IND提取所需的数据
d$pos[IND]
#> [1] 5 19 20
d[inds,]
#>chr pos ind0 ind1 ind2
#>5A 5G A
#>19 A 19 T C
#>20A 20G A
由(v0.3.0)于2019-08-30创建
对于装箱和计数,您可以这样做
positions=d$pos[inds]
箱子=序号(0、20、5)
ans=聚合(列表(位置=位置),列表(b=切割(位置,箱子)),c)
ans$n=长度(ans$pos)
ans
#b位置n
#1 (0,5] 5 1
#2 (15,20] 19, 20 2
非常感谢,然后我希望每个箱子的私人站点数量为1000个,并且打印位置。我已经编辑了上面的帖子,并指出了所需的输出文件。非常感谢。我还没有成功修改以下内容。如果个人有一个字母,例如“a”,而其他所有人都有一个字母“t”,那么总共有22个人或者“N”,它仍然是私有的(不仅仅是在有一个“N”的情况下)。我还想打印计数为0的箱子。因此,所有箱子(在我的情况下,在0到20000000之间,步骤为1000)都将显示私有位置计数(包括0),如果有私有位置,则位置将打印在计数旁边。
0 2 997, 999
1000 1 1086
2000 0
etc
res1 <- df1[ rowSums(df1$ind0 == df1 [, -c(1:3)]) == 0 &
apply(df1 [, -c(1:3)], 1, function(i) length(unique(i[ i != "N" ]))) == 1, ]
Count the number of positions with a private allele for ind0 in bins of 1000 bp:
res2<-table(cut(res1$pos, c(seq(0, 23092000, by=1000))))