将datatable1的值替换为r中的另一个datatable2

时间:2017-02-15 08:26:48

标签: r data.table

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

例如(简化形式): 数据表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

1 个答案:

答案 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