2015-11-03 94 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) 
相关问题