2013-07-11 76 views
1

我有兩個不同長度的數據幀,我想用第二個數據框的相應值向第一個數據框添加一個新列。如何根據多個條件將數據列添加到另一個數據框的值

相應的值由以下條件if (DF1[i,1] == DF2[,1] & DF1[i,2] == DF2[i,2]) == TRUE定義,則此行的值應取自DF2並寫入DF1$newColumn[i]

下面的數據幀被用來說明問題:

DF1<-data.frame(X = rep(c("A","B","C"),each=3), 
       Y = rep(c("a","b","c"),each=3)) 

DF2<-data.frame(X = c("A","B","C"), 
       Y = c("a","b","c"), 
       Z = c(1:3)) 

我試圖使用if()語句如在上面的文本,但在條件返回TRUE/FALSE的載體和不似乎不工作。

的作品,我現在使用的代碼是

for (i in 1 : length(DF1[,1])) { 
    DF1$Z[i] <- subset(DF2,DF2$X == DF1$X[i] & DF2$Y == DF1$Y[i])$Z    
} 

然而,它是慢得令人難以置信(用戶系統經過115.498 12.341 127.799我完全數據幀),並且必須有實現代碼更有效的方式。另外,我已經反覆閱讀了矢量化更有效的循環,但我不知道該怎麼做。

我確實需要條件語句的工作,雖然所以像

DF1$Zz<-rep(DF2$Z,each=3)

不會爲我的真實數據集工作。

+5

'merge(DF1,DF2)'??? – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto對於這個樣本數據集非常適用,但缺乏靈活性以便具有更復雜的邏輯,而不是簡單地將所有列匹配爲 – ds440

回答

1

DF1$Z <- sapply(1:nrow(DF1), function(i) DF2$Z[DF2$X==DF1$X[i] & DF2$Y==DF1$Y[i]])似乎佔用for循環的大約四分之一時間。

我創建了DF1,每個代表有300個代碼,我的函數花費了大約2秒的時間;你的循環與子集運行約8秒,並重新打包你的循環到一個sapply它需要約5秒運行。

+0

抱歉之前不接受答案,只是看到現在的問題有一個答案 – Latrunculia

相關問題