2012-04-09 85 views
1

我一直在試圖做到這一點,但沒有得到任何地方。任何幫助將非常感激。檢索使用for循環的兩個數據幀之間的匹配行

df1 <- data.frame(chrom = "chr1", start=c(10,20,30), end = c(100,200,300), stringsAsFactors=FALSE) 
df2 <- data.frame(chrom = c("chr1", "chr2", "chr3"),start=c(15,500,150), end = c(75,1000,300), stringsAsFactors=FALSE) 

我想去的地方df1$chrom == df2$chrom獲得DF2的所有行。或者更好的是:我想在一個新的向量中生成輸出,並顯示df1後跟df2或反之亦然的行,其中df1$chrom == df2$chrom

我已經嘗試了這個使用for循環如下:

for(i in 1:nrow(df2)){ 
    x[i] <- df2[which(df1$chrom == df2$chrom[i])] 
} 

不工作!

+0

你在完成數據幀之間的比較時試圖完成什麼?對於您的工作流程,可能比您採用的方法更簡單 - 例如,如果您只需要一個數據框架中的矢量,您是否需要許多此類矢量?一個新的數據框?什麼是最終目標?這個背景對你所問的問題很重要。 – 2012-04-09 20:17:37

回答

3

這是你想要的嗎?

df2[df2$chrom == df1$chrom, ] 
# chrom start end 
# 1 chr1 15 75 

根據您的意見,您可能還想嘗試以下操作。

merge(df1, df2, by = 'chrom') 

這將在兩個幀(「表」)上執行數據庫「連接」。結果是這樣。

chrom start.x end.x start.y end.y 
1 chr1  10 100  15 75 
2 chr1  20 200  15 75 
3 chr1  30 300  15 75 

這並不總是一種有效的方法來接收R,但它很方便。您可以使用參數控制「.x」內容(請參閱幫助頁面:?合併)。如果您希望包含df2的所有字段,則可以添加「all = TRUE」參數設置進行合併。

正如我以前提到的那樣,最好考慮整體方法。這不一定是處理數據的有效方式,因爲現在您已在輸入框架中輸入了大量冗餘。相反,用數據庫術語來說,我們認爲df2是一個「查找」表。 df1中的「chr1」引用與df1相關但與之不同的df2(外鍵)中的信息。正如上面的合併所顯示的那樣,如果重複df2的信息,我們可以在需要時簡單地訪問它。這是合併使得方便的地方。

+0

是的,這正是我想要的格式。在具有6列的新數據幀中並排存在兩個數據幀的匹配行將是很好的。實際上,我的最終目標要比兩個數據框之間滿足許多條件的比較要複雜得多。上述情況只是其中之一。 – user1079898 2012-04-09 20:18:50

+0

您發送的聲明非常有效。謝謝。我很難把頭圍繞在它周圍......但它的工作原理!非常感謝你 – user1079898 2012-04-09 20:24:04

+0

它首先很難得到(特別是如果你習慣於使用循環的另一種語言),但一旦你得到它,它非常簡單。如果您有多個條件,請記住'%in%'和邏輯運算符'&'和'|'是索引中的重要工具,這是Bryan顯示的方法(而不是顯式循環)。 – 2012-04-09 21:13:17

相關問題