【发布时间】:2017-09-17 08:02:55
【问题描述】:
我需要对大型(数百万行)数据集进行批量重新映射。
样本数据:
DT = data.table(yr = sample(3)+2000, a1 = sample(12), a2 = sample(12))[order(yr)]
DT
yr a1 a2
1: 2001 2 8
2: 2001 3 12
3: 2001 10 4
4: 2001 9 6
5: 2002 7 7
6: 2002 11 3
7: 2002 5 2
8: 2002 1 11
9: 2003 8 5
10: 2003 12 1
11: 2003 6 9
12: 2003 4 10
DTmap = data.table(a1 = 1:12, b=10001:10012)
DTmap
a1 b
1: 1 10001
2: 2 10002
3: 3 10003
4: 4 10004
5: 5 10005
6: 6 10006
7: 7 10007
8: 8 10008
9: 9 10009
10: 10 10010
11: 11 10011
12: 12 10012
我想用 DTmap 中的映射映射 DT 中的 a1 和 a2 列。忽略它们只是 10000 种不同的事实 - 这是样本数据的人工制品,可以轻松检查结果的准确性。 我可以用这样的一系列连接来做到这一点:
setkey(DT,a1)
setkey(DTmap,a1)
DT.merge1 <- DT[DTmap]
setkey(DT.merge1,a2)
setnames(DTmap,c("a2","b"))
setkey(DTmap,a2)
DT.merge2 <- DT.merge1[DTmap]
DT.merge2
yr a1 a2 b i.b
1: 2003 12 1 10012 10001
2: 2002 5 2 10005 10002
3: 2002 11 3 10011 10003
4: 2001 10 4 10010 10004
5: 2003 8 5 10008 10005
6: 2001 9 6 10009 10006
7: 2002 7 7 10007 10007
8: 2001 2 8 10002 10008
9: 2003 6 9 10006 10009
10: 2003 4 10 10004 10010
11: 2002 1 11 10001 10011
12: 2001 3 12 10003 10012
DT.merge2[, `:=` (a1 = NULL, a2 = NULL)]
setnames(DT.merge2,c("year","b1","b2"))
DT.merge2
year b1 b2
1: 2003 10012 10001
2: 2002 10005 10002
3: 2002 10011 10003
4: 2001 10010 10004
5: 2003 10008 10005
6: 2001 10009 10006
7: 2002 10007 10007
8: 2001 10002 10008
9: 2003 10006 10009
10: 2003 10004 10010
11: 2002 10001 10011
12: 2001 10003 10012
似乎有一种方法可以在 data.table 语法中使用 by() 或其他方法来执行此操作,但我无法弄清楚。我是一个相当新的 R 编码器,但对其他语言有很多经验。 这可能吗?上面的代码相对较快,但是有很多编码(通过 setkey)。似乎将 by() 与索引一起使用,然后通过引用更新这些值会快得多。
【问题讨论】:
标签: r mapping data.table