2013-08-19 50 views
1

我有两个dataframes像这样:映射值和替换

节点:

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(),但目前还不清楚如何我将能够使用这个不知道指数。

+0

检查*?匹配*功能。 – Fernando

+1

你的预期输出是什么?最后我想你的想法并不清楚。 – Metrics

+0

我也无法理解。 – Fernando

回答

4

映射old_idnew_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 
+0

这使得很多感觉。谢谢! –

+1

这终于结束了,我得到了所有的NAs。我仍然试图找出原因。 –

+0

@OlgaMu,必须有一些不同于你的例子。你还有这种结构的数据帧吗? – Julius

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 
+0

直到现在我假设匹配和百分之%是同义词。 +1打开我的眼睛。 – Masterfool

+0

'%in%'是'match'的一个特殊应用,但'match'返回一个数字向量而不是一个逻辑向量。它们都可以用于构建查找索引向量。 –

+0

由于'%in%'没有给出匹配的位置,它对于这个任务有什么用处? – Masterfool