如何在 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
数据框中的 Start
和 End
内 - 我做了一个例如他们在哪里。
其次:您想使用该行与样本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
的估计有偏差
我有两个数据框,一个用于 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
数据框中的 Start
和 End
内 - 我做了一个例如他们在哪里。
其次:您想使用该行与样本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