我有一个文件,我已经过滤了我的LD的SNP(在下面的例子中; my.filtered.snp.id)。我想在我的基因型矩阵(geno_snp)中只保留这些SNP,我试图在R中编写for循环,我将不胜感激任何修复我的代码的帮助。我希望将这些行(整行包括snp.id和基因型信息)保存在基因型矩阵中,其中snp.id与my.filtered.snp.id中的snp.id匹配,并删除那些不匹配的行。
head(my.filtered.snp.id)
Chr10_31458
Chr10_31524
Chr10_45901
Chr10_102754
Chr10_102828
Chr10_103480
head (geno_snp)
XRQChr10_103805 NA NA NA 0 NA 0 NA NA NA NA NA 0 0
XRQChr10_103937 NA NA NA 0 NA 1 NA NA NA NA NA 0 2
XRQChr10_103990 NA NA NA 0 NA 0 NA NA NA NA NA 0 NA
我正在尝试这样的事情:
for (i in 1:length(geno_snp[,1])){
for (j in 1:length(my.filtered.snp.id)){
if geno_snp[i,] == my.filtered.snp.i[j]
print (the whole line in geno_snp)
}
else (remove the line)
}
答案 0 :(得分:1)
如果我理解正确,您需要data.frame geno_snp
的子集,其中行名称必须与向量my.filtered.snp.id
中选定的SNP ID匹配。
请检查此解决方案是否适合您:
index <- unlist(sapply(row.names(geno_snp), function(x) grep(pattern = x, x = my.filtered.snp.id)))
selected_subset <- geno_snp[index,]
我所做的是创建一个索引,用于处理名称与my.filtered.snp.id
中的任何值匹配的行。然后我使用索引来创建数据帧的子集。由于在grep
的帮助下应用sapply
函数的结果是以列表的形式存在,因此我使用unlist
以向量的形式获取结果。
编辑:
我注意到你有一些row.names与你原来的my.filtered.snp.id
值完全匹配。在这种情况下,也许你想做的是:
index <- unlist(sapply(my.filtered.snp.id, function(x) grep(pattern = x, x = row.names(geno_snp))))
selected_subset <- geno_snp[index,]
问题是你有一个row.names与XRQ
开始...所以在最后一种情况下,代码使用my.filtered.snp.id
中的参考值来检测row.names(geno_snp)
中的匹配,甚至如果在它的开头有这个XRQ
字符串。
最后,如果我误解了你的数据,我在这里调用行名实际上是列中的数据(SNP ID),只需使用geno_snp[,1]
代替{{ 1}}在上面的两个代码中。