2015-11-03 134 views
0

如果是基本問題或重複問題,我表示歉意,但我是初學者R用戶。按兩列匹配兩個數據幀並從第三列中提取值

我試圖按性別和年齡將Dataframe A中的每一行都匹配到Dataframe B中的兩個對應列。我知道肯定會有匹配,所以我想從兩個不同的匹配行中提取值Dataframe B中的列並將它們存儲在Dataframe C中。

Dataframe A       Dataframe B 

ID Sex Age Weight   Row Sex Age X1 X2 
1  1 24 36    1 1 24 18.2 12.3 
2  1 34 56    2 2 87 15.4 16.5 
3  2 87 12    3 1 64 16.3 11.2 
4  2 21 08    4 2 21 15.6 14.7 
5  1 64 33    5 1 34 17.7 18.9 
... 


Dataframe C 
ID Age Sex Weight Y1 Y2 
1  1 24 36  18.2 12.3 
2  1 34 56  17.7 18.9   
3  2 87 12  15.4 16.5   
4  2 21 08  15.6 14.7   
5  1 64 33  16.3 11.2     

我的數據框中有9000個ID。我看過類似的問題,像這樣的

Fill column values by matching values in each row in two dataframe

但我不認爲這我正確地應用此代碼。 for循環在這裏會有用嗎?

for(i in 1:nrow(ID){ 
    dfC[i,Y1] <-df2[match(paste(dfA$Sex,dfa$Age),paste(dfB$Sex,dfB$Age)),"X1"] 

    dfC[i,Y2] <-df2[match(paste(dfA$Sex,dfa$Age),paste(dfB$Sex,dfB$Age)),"X2"] 
} 

我知道合併功能也被建議,但這兩個變量在我的數據集中並沒有實際命名相同的方式。

謝謝!

+0

爲什麼不重命名變量,這樣的按鍵匹配的名字嗎?如果確實存在問題,請使用合併中的by.x和by.y鍵。 – bramtayl

+0

當我嘗試這個,我失去了大約700觀察。我不確定DFA中每個年齡和性別差異的原因都應該在DFB中具有相應的年齡和性別值。如果DFB中的變量是「因素」,而DFA中的變量是「num」,那麼這很重要嗎? – user2324

+0

將所有= TRUE添加到您的合併調用中,您可以親自看到問題所在。我不認爲這應該是非關鍵變量的類型。 – bramtayl

回答

0

試試這個兄弟......減少功能的R用這樣的操作

set.seed(1) 
list.of.data.frames = list(data.frame(id=1:10, sex=1:10 , age =1:10 , weight=1:20), data.frame(row=5:14, sex=11:20 , age :1:20 , x1:1:10, x2:1:10), data.frame(id=8:14, sex=11:20 , age :1:20 ,weight:20:30, y1:1:10, y2:1:10)) 
merged.data.frame = Reduce(function(...) merge(..., all=T), list.of.data.frames) 
tail(merged.data.frame) 
相關問題