2017-02-15 13 views
0

rでlibrary(data.table)を使用して、datatable1の値を別のdatatable2と効率的に置き換えたいとします。どちらのデータも2mil +のレコードを持っています。例えばdatatable1の値をrの別のdatatable2に置き換えます

(簡略形式): データテーブル1はlike-見える

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

こんにちはを交換し、SOに歓迎例のデータを生成します。何か試して問題がありましたか? –

+0

あなたがする必要があるのは、ソースの内部結合と、次にtarget.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 
関連する問題