2014-08-28 57 views
2

我有兩個數據幀(df1,df2)。我想填寫從df1到df2的年齡和性別值,條件是兩者之間具有相同的ID。我嘗試了幾種使用for-loop並檢查兩個數據幀之間的主題ID匹配的方法,但是我失敗了。結果應該和df3一樣。我有一個巨大的數據集,所以我想在R中的一段代碼可以很容易地做到這一點。我很感謝你的幫助。謝謝。使用R中的兩個數據幀中的匹配ID填充的列

df1: 
ID AGE SEX 
90901 39 0 
90902 28 0 
90903 40 1 

df2: 
ID  AGE SEX Conc 
90901 NA NA 5 
90901 NA NA 10 
90901 NA NA 15 
90903 NA NA 30 
90903 NA NA 5 
90902 NA NA 2.45 
90902 NA NA 51 
90902 NA NA 1 
70905 NA NA 0.5 

result: 
df3: 
ID  AGE SEX Conc 
90901 39 0  5 
90901 39 0  10 
90901 39 0  15 
90903 40 1 30 
90903 40 1 5 
90902 28 1 2.45 
90902 28 0 51 
90902 28 0  1 
70905 NA NA 0.5 
+0

[如何在R(內部,外部,左側,右側)連接數據幀?](http://stackoverflow.com/questions/1299871/how-to-join-data-frames-in- r-inner-outer-left-right) – Henrik 2014-08-28 06:50:39

+0

謝謝大家!這真是太棒了:-)我希望我能夠理解並運用適用的家庭功能。他們非常有用,但需要刻苦思考。如果有人指導我使用一些有用的資源,那將會很棒。 – Amer 2014-08-29 15:39:33

回答

5

您可以使用matchlapply。如果我們通過在名稱向量上的每個原始數據集的ID列上迭代[[,我們可以得到期望的結果。

nm <- c("AGE", "SEX") 
df2[nm] <- lapply(nm, function(x) df1[[x]][match(df2$ID, df1$ID)]) 
df2 
#  ID AGE SEX Conc 
# 1 90901 39 0 5.00 
# 2 90901 39 0 10.00 
# 3 90901 39 0 15.00 
# 4 90903 40 1 30.00 
# 5 90903 40 1 5.00 
# 6 90902 28 0 2.45 
# 7 90902 28 0 51.00 
# 8 90902 28 0 1.00 
# 9 70905 NA NA 0.50 

請注意,這也比merge快很多。

5

嘗試merge(df1, df2, by = "id")。這會將你的兩個數據幀合併在一起。如果您的示例能夠很好地表示您的實際數據,那麼您可能希望在合併之前先從df2中刪除年齡和性別列。

df2$AGE <- NULL 
df2$SEX <- NULL 
df3 <- merge(df1, df2, by = "id") 

如果你需要保持從DF2行,即使你沒有在DF1匹配的ID,那麼你這樣做:

df2 <- subset(df2, select = -c(AGE,SEX)) 
df3 <- merge(df1, df2, by = "id", all.y = TRUE) 

您可以瞭解更多有關merge(或[R功能)在您的控制檯中輸入?merge()

相關問題