2017-02-15 52 views
0

我想在r中使用库(data.table)来高效地将datatable1的值替换为另一个数据表2。这两个数据表都有2mil +记录。将数据表1的值替换为r中另一个数据表2的值

例如(简化的形式): 数据表1看起来喜欢 -

Source Target Col1 Col2 
277 266 a b 
260 277 b s 
276 277 d c 
265 258 a v 
259 258 d s 
262 262 d x 
270 274 e q 
273 277 f w 

数据表2:

ToBeMapStr LookUpValue 
256 1 
257 2 
258 3 
259 4 
260 5 
261 6 
262 7 
263 8 
264 9 
265 10 
266 11 
267 12 
268 13 
269 14 
270 15 
271 16 
272 17 
273 18 
274 19 
275 20 
276 21 
277 22 

在data.table1所需的输出应为:

Source Target Col1 Col2 
22 11 a b 
5 22 b s 
21 22 d c 
10 3 a v 
4 3 d s 
7 7 d x 
15 19 e q 
18 22 f w 
+0

Hi和欢迎SO。你尝试过什么并且有问题吗? –

+0

你需要做的是内部连接源,然后内部连接的目标.https://rstudio-pubs-static.s3.amazonaws.com/52230_5ae0d25125b544caab32f75f0360e775.html – theArun

+0

另一种选择是转换为长格式,替换连接中的值,然后(可选)重新变换为宽格式 –

回答

0

您可以使用功能match为此使用R Base。

生成例如数据

str1 <- 'Source Target Col1 Col2 
277 266 a b 
260 277 b s 
276 277 d c 
265 258 a v 
259 258 d s 
262 262 d x 
270 274 e q 
273 277 f w' 

str2 <- 'ToBeMapStr LookUpValue 
256 1 
257 2 
258 3 
259 4 
260 5 
261 6 
262 7 
263 8 
264 9 
265 10 
266 11 
267 12 
268 13 
269 14 
270 15 
271 16 
272 17 
273 18 
274 19 
275 20 
276 21 
277 22 
' 

file1 <- textConnection(str1) 
file2 <- textConnection(str2) 
dt1 <- read.table(file1, header = T) 
dt2 <- read.table(file2, header = T) 

替换值

dt1$Source <- dt2[match(dt1$Source,dt2$ToBeMapStr),'LookUpValue'] 
dt1$Target <- dt2[match(dt1$Target,dt2$ToBeMapStr),'LookUpValue'] 

dt1 

结果

Source Target Col1 Col2 
1  22  11 a b 
2  5  22 b s 
3  21  22 d c 
4  10  3 a v 
5  4  3 d s 
6  7  7 d x 
7  15  19 e q 
8  18  22 f w 
相关问题