2014-01-14 40 views
4

我有三组标识符:“x”,“y”和“z”。我也有两个2列数据帧,每个数据帧将一组标识符映射到另一组标识符。transitively映射标识符

x2y = data.frame(x = c("A","A","B","B","C","D","E","F"), 
        y = c(1,2,1,2,3,4,4,5)) 
y2z = data.frame(y = c(1,1,2,3,4,4,5,5,5), 
        z = c(1,2,3,3,6,7,6,7,8)) 

这可以在下图中看到。请注意,每个箭头对应于数据框中的一行。

enter image description here

问: 我如何使用这两个映射(两个数据帧),使从xz(如上图上的右侧显示)的映射 。 I 认为它是“传递映射”:x to yy to z给出x to z。 数据帧,我想是...

x2z = data.frame(x = c("A","A","A","B","B","B","C","D","D","E","E","F","F","F"), 
        z = c(1,2,3,1,2,3,3,6,7,6,7,6,7,8)) 

注:我的数据帧通常〜50,000行,如此高效的代码是非常重要的。当我用循环解决这个问题时,需要几分钟才能运行。 我唯一的要求是,代码是R.

+0

你的图形看起来很漂亮。你是怎么做的? –

+0

它是用Adobe Illustrator手动绘制的。我曾考虑过使用像Rgraphviz这样的东西,但是这个小型的一次性案例并不值得。 – kdauria

回答

2

要合并:

merge(x2y, y2z)[c('x','z')] 
## x z 
## 1 A 1 
## 2 A 2 
## 3 B 1 
## 4 B 2 
## 5 A 3 
## 6 B 3 
## 7 C 3 
## 8 D 6 
## 9 D 7 
## 10 E 6 
## 11 E 7 
## 12 F 6 
## 13 F 7 
## 14 F 8 

它帮助这里的名字同意在必要。

+1

谢谢。当28个字符解决了我的1,655个字符加数字问题时,我总是喜欢。它效果很好。 – kdauria