2014-03-27 92 views
1

我有兩個數據幀的相等行數:提取兩個數據幀(在R)

a1<-data.frame(a=c(0.5,0.4,0.4,0.2),b=c(0.4,0.3,0.5,0.2)) 

a2<-data.frame(Check1=c(0.1,0.1,0.1,0.1,0.1,0.2,0.2,0.2,0.2,0.2,0.3,0.3,0.3,0.3,0.3,0.4,0.4,0.4,0.4,0.4,0.5,0.5,0.5,0.5,0.5),Check2=rep(c(0.1,0.2,0.3,0.4,0.5),times=5),Result=letters[1:25]) 

A1是兩個值的觀測的集合,所以不同的行是觀察組。我們可以看數據框a2來讀取a1中觀察到的組合的什麼樣的結果(a2的第三列)。例如,a1中的第一行是(0.5,0.4),我們在a2中看到這給了我們結果「x」。

現在,我想在a1中創建一個新的列,其中a2的「result」列中的值與我們在a1中找到的行匹配。這樣,例如,在a1.new第一行變爲: (0.5,0.4, 「X」)

輸出將是:

a1.new<-data.frame(a=c(0.5,0.4,0.4,0.2),b=c(0.4,0.3,0.5,0.2),Result=c("x","r","t","g")) 

是否有這樣做的有效途徑?

+1

a2或a1的相應結果?你能顯示出你期望的這些數據框的輸出嗎? – Aashu

回答

1

可以匹配列

a1$result <- a2$Result[match(paste0(a1$a,a1$b), paste0(a2$Check1,a2$Check2))] 

match返回第一個參數的[即位置。 paste0(a1 $ a,a1 $ b)]在第二個[即。 paste0(A2 $檢查1,A2 $ CHECK2)。所以這生產

(m <- match(paste0(a1$a,a1$b), paste0(a2$Check1,a2$Check2))) 
#[1] 24 18 20 7 

然後a2Result是子集使用[。這將在匹配產生的相應位置選擇a2 $ Result的值。

a2$Result[m] 
#[1] "x" "r" "t" "g" 
+0

精湛!謝謝! – Erosennin

2

排序是這樣的:

newcol<-vector() 
for (j in 1:nrow(a2)) { 
    thematch <- which(a2[,1:2] == a1[j,]) 
    if (length(thematch)>0) newcol<-c(newcol,a2[thematch,3]) 
    } 

然後,假設在a1每一行都有一個比賽,sa1.new <- cbind(a1,newcol)

我認爲會做到這一點。

+0

在'哪個'行中缺少括號嗎? 添加括號和運行代碼給我以下錯誤: 錯誤Ops.data.frame(A2 [1:2],A2 [J,]): ==只爲相等大小的數據所定義的幀 – Erosennin

+0

@ErosRam是的,對於印刷錯誤 - 對編輯。但是我認爲無論如何我都更喜歡user20650的答案。 –