在R中做循环

时间:2017-07-10 22:02:04

标签: r loops for-loop

我有一个文件,我已经过滤了我的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)
  }

1 个答案:

答案 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}}在上面的两个代码中。