2013-07-01 22 views
0

我是R新手,需要處理此問題的建議:2個表之間的高級數據匹配

我有2個表。表的開始如下所示:

表1:

SNP    Gene  Pval Best_SNP Best_Pval 
rs2932538 ENSG00000007341 5.6007 
rs10488631 ENSG00000064419 7.7461 
rs12537284 ENSG00000064419 4.5544 
rs3764650 ENSG00000064666 12.3401 
rs10479002 ENSG00000072682 5.0141 
rs6704644 ENSG00000072682 6.2306 
rs2900211 ENSG00000072682 9.9022 

表2:

Best_SNP   Gene  Best_Pval 
rs9028922 ENSG00000007341 10.7892 
rs8233293 ENSG00000064666 89.342 
rs3234432 ENSG00000072682 32.321 
rs2892334 ENSG00000064419 43.235 

表1包含SNP的每個基因的整個列表。表2包含表1中出現的每種基因的最佳SNP和相應的最佳Pval。

我想要做以下事情:匹配表1到表2中的每個基因,然後從表2中複製Best_SNP和Best_Pval並將它們粘貼到表1中的Best_SNP和Best_Pval列中。 棘手的部分是在表1中,每個基因重複一個隨機的,不同數量的行。例如,第二個基因ENSG00000064419重複2行,ENSG00000072682重複3行。因此,代碼需要通過基因名稱進行篩選,並且只對同一個基因拷貝Best_SNP和Best_Pval 一次

因此,對於基因ENSG00000072682,在3行中,只有第一行看起來包含該基因需要填充Best_SNP和Best_Pval列。我不希望剩下的兩行重複請填寫Best_SNP和Best_Pval列。可以更輕鬆地查看每個基因的起始位置和結束位置。

+0

這是那種'在Excel vlookup'功能。你可以在R中看到[這裏](http://stackoverflow.com/questions/15303283/how-to-do-vlookup-and-fill-down-like-in-excel-in-r) – Metrics

回答

0

如果我理解正確的問題,這是解決方案:

x <- structure(list(SNP = c("rs2932538", "rs10488631", "rs12537284", "rs3764650", 
"rs10479002", "rs6704644", "rs2900211"), Gene = c("ENSG00000007341", "ENSG00000064419", 
"ENSG00000064419", "ENSG00000064666", "ENSG00000072682", "ENSG00000072682","ENSG00000072682"), 
Pval= c(5.6007, 7.7461, 4.5544, 12.3401, 5.0141, 6.2306, 9.9022)), row.names= c(NA, 7L), class = "data.frame") 

x 
     SNP   Gene Pval 
1 rs2932538 ENSG00000007341 5.6007 
2 rs10488631 ENSG00000064419 7.7461 
3 rs12537284 ENSG00000064419 4.5544 
4 rs3764650 ENSG00000064666 12.3401 
5 rs10479002 ENSG00000072682 5.0141 
6 rs6704644 ENSG00000072682 6.2306 
7 rs2900211 ENSG00000072682 9.9022 

x1 <- x[!(duplicated(x$Gene) | duplicated(x$Gene, fromLast = FALSE)), ] 

x1 
     SNP   Gene Pval 
1 rs2932538 ENSG00000007341 5.6007 
2 rs10488631 ENSG00000064419 7.7461 
4 rs3764650 ENSG00000064666 12.3401 
5 rs10479002 ENSG00000072682 5.0141 

y <- structure(list(Best_SNP = c("rs9028922", "rs8233293", "rs3234432", "rs2892334"), Gene = c("ENSG00000007341", "ENSG00000064666", 
"ENSG00000072682", "ENSG00000064419"), 
Best_Pval= c(10.7892, 89.342, 32.321, 43.235)), row.names= c(NA, 4L), class = "data.frame") 

y 
    Best_SNP   Gene Best_Pval 
1 rs9028922 ENSG00000007341 10.7892 
2 rs8233293 ENSG00000064666 89.3420 
3 rs3234432 ENSG00000072682 32.3210 
4 rs2892334 ENSG00000064419 43.2350 


merge(x1, y, by="Gene", all= FALSE) 

      Gene  SNP Pval Best_SNP Best_Pval 
1 ENSG00000007341 rs2932538 5.6007 rs9028922 10.7892 
2 ENSG00000064419 rs10488631 7.7461 rs2892334 43.2350 
3 ENSG00000064666 rs3764650 12.3401 rs8233293 89.3420 
4 ENSG00000072682 rs10479002 5.0141 rs3234432 32.3210 
+0

你好謝謝。此代碼似乎刪除了重複相同基因的行。但是有沒有辦法保留表1中的所有行;如果一個基因重複,那麼我只想複製第一行中的第一個**基因的Best_SNP和Best_Pval(在基因重複一行接一行的所有行中)。 – zfz