我想在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
答案 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