如何在 R 中找到符合条件的所有行和 return 匹配行?

How can I find all rows that match a criteria and return matching rows in R?

我有两个数据框,一个用于 SNP,一个用于基因。

对于每个基因,如果 SNP 位置在 window 大小内,我想将该行 return 到数据框。然后我想找到那个特定的 SNP 和那个基因之间的相关性,如果它在 window 中。我目前正在使用 R.

基因数据框:

Chr Start   End sample1 sample2 sample3
10  100015109   100015443   2   1   1
10  100365832   100368960   1   0   2
10  100486970   100487277   2   1   0

SNP 数据框:

SNP CHROM   POSITION    sample1 sample2 sample3
rs3766180   1   1478153 1   1   2
rs7540231   1   1506035 2   2   0
rs2272908   1   1721479 1   1   2
rs10907187  1   1759054 0   1   2

到目前为止我已经有了这段代码,但我不确定我是否在进行正确的迭代。我想遍历基因并检查哪些 snp 位于 window 大小内,并找到该 snp 和该基因之间的 r 平方。例如,如果 snp1 的位置位于基因的开始和结束范围内,则 select 该行,然后在这两行之间求 r 平方。我认为我的循环是错误的,可能有更简单的方法。请帮忙。

snps <- as.matrix(read.table("snps.txt", header=T, sep="\t"))
genes <- as.matrix(read.table("genes.txt", header=T, sep="\t"))

#Set upper and lower bounds
size = 1000000
window_left = genes$cnvStart - size
window_right = genes$cnvEnd + size
snp_pos <- snps$POS
snp <- snps$ID


for (s in 1:nrow(snps)){
  for(g in 1:nrow(genes)){
    if (snp_pos >window_left & snp_pos < window_right){
         corr.matrix2 <- (cor(t(s),t(g),use="pairwise.complete.obs", method="pearson"))
      new_snps <- cbind(snp, snps[,-3])
    }
  }
}

我想要的输出是每个 selected snp 基因比较的 table r 平方值。 任何想法将不胜感激。

谢谢, 内夫

我复制你的代码并评论它

snps <- as.matrix(read.table("snps.txt", header=T, sep="\t"))
genes <- as.matrix(read.table("genes.txt", header=T, sep="\t"))

没有错但是最好在文件名上说清楚是什么文件,如果用tab分隔就是tsv文件(tab s分开了 files)。这样您就可以使用其他程序(Microsoft Excel 或类似程序)更轻松地打开它们

#Set upper and lower bounds
size = 1000000
window_left = genes$cnvStart - size
window_right = genes$cnvEnd + size
snp_pos <- snps$POS
snp <- snps$ID

这里设置的是变量,但是得到的是向量,所以snp或者snp_pos都是向量。如果你想以后使用它,你必须知道你想要哪种数据。

for (s in 1:nrow(snps)){
  for(g in 1:nrow(genes)){

在获得数据帧所需的信息后,您可以通过 snps 行数和基因行数进行迭代。为什么不使用 snp_pos 和 snp 变量?

    if (snp_pos >window_left & snp_pos < window_right){

在这里你可以比较所有你想要的,你不需要前面的两个for循环。

         corr.matrix2 <- (cor(t(s),t(g),use="pairwise.complete.obs", method="pearson"))

您不使用所选变量来创建成对相关性。你应该使用你的变量。我还建议绘制相关性以进行视觉比较。 (您可能也需要它们)

      new_snps <- cbind(snp, snps[,-3])
    }
  }
}

这不会创建一个 table 它连接到一个不是 table 的数据帧中的向量。

我还没有测试过,但我会这样做:

snps <- as.matrix(read.table("snps.txt", header=T, sep="\t"))
genes <- as.matrix(read.table("genes.txt", header=T, sep="\t"))

#Set upper and lower bounds
size = 1000000
window_left = genes$cnvStart - size
window_right = genes$cnvEnd + size

in_window = snps[snps$POS >window_left & snps$POS < window_right]
corr.matrix2 <- (cor(in_window$, in_window$ ,use="pairwise.complete.obs", method="pearson"))

我真的不知道你想做哪个关联,所以你应该改变cor函数的前两个参数(不完整的in_window$)。我猜您想比较哪些样本具有哪些 SNP。但那是另一个问题 ;)

好的,我还有一些不清楚的地方。

首先:SNP 数据框中的 none 个位置在 Genes 数据框中的 StartEnd 内 - 我做了一个例如他们在哪里。

其次:您想使用该行与样本1,2和3下的另一行关联吗?

e.i 如果你想让它们排成一行。

Chr Start   End sample1 sample2 sample3
10  100015109   100015443   2   1   1 <----  THIS ROW?

SNP CHROM   POSITION    sample1 sample2 sample3
rs3766180   1   1478153 1   1   2    <---- AND THIS ROW?

My understanding is that you want to correlate   2   1   1  with  1   1   2

我现在有一个工作示例:

Genes<-data.frame(Chr=c(10,10,10),Start=c(100015109,100365832,100486970),End=c(100015443,100368960,100487277),sample1=c(2,1,2),sample2=c(1,0,1),sample3=c(1,2,0))
SNP <- data.frame(SNP= c("rs3766180","rs7540231","rs2272908"),CHROM=c(1,1,1),POSITION=c(100015200,100365831,100486971),sample1=c(1,2,1),sample2=c(1,2,1),sample3=c(2,0,2))

> Genes
  Chr     Start       End sample1 sample2 sample3
1  10 100015109 100015443       2       1       1
2  10 100365832 100368960       1       0       2
3  10 100486970 100487277       2       1       0
> SNP
        SNP CHROM  POSITION sample1 sample2 sample3
1 rs3766180     1 100015200       1       1       2
2 rs7540231     1 100365831       2       2       0
3 rs2272908     1 100486971       1       1       2

CorTestMatrix <- data.frame()

for (igene in 1:nrow(Genes)) { # for every gene
        curGeneRow <- Genes[igene ,] # take that row
        for (isnp in 1:nrow(SNP)) { # for every SNP
                cursnp <- SNP[isnp ,] # take that row of SNP
                if (cursnp$POSITION > curGeneRow$Start & curGeneRow$End > cursnp$POSITION) { # is the SNP in the Gene Window=
                        x<-as.numeric(as.vector(cursnp[,4:ncol(cursnp)])) # if you want the row from Position, 
                        y<-as.numeric(as.vector(curGeneRow[,4:ncol(curGeneRow)])) # and want the row from End
                        corTest <- cor.test(x,y) # correlate those two 
                        CurTestMatrix <- data.frame(GeneChr=curGeneRow$Chr,SNP=levels(droplevels(cursnp$SNP)),test=as.numeric(corTest[3]))
                        # saves some info from both Dataframes and the p Value from the cortest.
                        # you need edit this to get additional data. 
                        CorTestMatrix <- smartbind(CorTestMatrix,CurTestMatrix)

                }

        }
}

> CorTestMatrix
    GeneChr       SNP      test
1:1      10 rs3766180 0.6666667
1:2      10 rs3766180 0.6666667
2        10 rs2272908 0.3333333

可能有更快的方法来执行此操作,但是 for 循环很容易编辑和使用。我已经这样做了,所以 SNP 的第一行和第三行应该在 GeneRow 1 和 3 的开始和结束内,分别等于 2 个相关性测试。

如果需要,我建议纠正非正态分布的样本:

sp_Cov1 <- shapiro.test(x);sp_Cov2 <- shapiro.test(y) # correction for non-normallity
if(sp_Cov1[2] < 0.05 | sp_Cov2[2] < 0.05) {correlationToUse = 'kendall'
} else {correlationToUse = 'pearson'}

 corTest <- cor.test(x,y,method=correlationToUse)  

避免对 p$value

的估计有偏差