映射值和替换

时间:2013-08-19 21:26:20

标签: r

我有两个像这样的数据框:

节点:

new_id  Name  old_id
1        foo    560
2        fie    561
3        fee    562
4        fim    563

RELS:

StartID   EndID
560       561
561       563
561       562
563       560

第二个文件中的ID是第一个中的旧ID。我想根据第一个文件中的匹配行更新第二个文件中的ID。

期望结束:

StartID  EndID
1         2
2         4
2         3
4         1

我在看replace(),但我不清楚如何在不知道指数的情况下使用它。

2 个答案:

答案 0 :(得分:4)

old_id映射到new_id

的向量
(map <- setNames(nodes$new_id, nodes$old_id))
#560 561 562 563 
#  1   2   3   4 

以及使用它的一种方法是以下

apply(rels, 2, function(x) map[as.character(x)])
#     StartID EndID
#[1,]       1     2
#[2,]       2     4
#[3,]       2     3
#[4,]       4     1

答案 1 :(得分:3)

match函数(将索引返回到new_id)就是您所寻找的:

cbind(StartID = Nodes$new_id[match( Rels$StartID ,Nodes$old_id)] , 
      EndID = Nodes$new_id[match( Rels$EndID ,Nodes$old_id)] )

     StartID EndID
[1,]       1     2
[2,]       2     4
[3,]       2     3
[4,]       4     1