我有一个很长的表,其中包含 R 中的数据,其中包含一些关键列和一个具有相同关键列和一些额外变量的查找表。我想从查找表中选择基于相同键的子集,并通过对公共变量进行插值来填充数据表中的新列。
我尝试举一个简化的例子:
> data <- data.table(A = c("A","A","A","B","B","B","C","C","C"),
+ B = c(1,1,1,1,1,1,2,2,2),
+ C = rep(c(0.15, 0.22, 0.3),3))
> data
A B C
1: A 1 0.15
2: A 1 0.22
3: A 1 0.30
4: B 1 0.15
5: B 1 0.22
6: B 1 0.30
7: C 2 0.15
8: C 2 0.22
9: C 2 0.30
> look <- data.table(A = c("A","A","A","B","B","B","C","C","C"),
+ B = c(1,1,1,1,1,1,2,2,2),
+ C = rep(c(0.1, 0.2, 0.3),3),
+ D = c(10, 20, 30, 11,22,33,12,24,36))
> look
A B C D
1: A 1 0.1 10
2: A 1 0.2 20
3: A 1 0.3 30
4: B 1 0.1 11
5: B 1 0.2 22
6: B 1 0.3 33
7: C 2 0.1 12
8: i 2 0.2 24
9: C 2 0.3 36
我想要匹配的
A
和 B
列来使用 look$C
和 look$D
并通过基于 data$D
进行插值来创建新的 data$C
列。
我有一个 for 循环,对于每个匹配的 A、B 组合,从
matched
创建一个子集 look
运行 f <- approxfun(look$C, look$D)
并应用它 data[ A == 'A' & B == 1, D := f(C) ]
。
所以在一次迭代中就会像
f <- approxfun(c(0.1, 0.2, 0.3), c(10, 20, 30) )
f(c(0.15, 0.22, 0.3))
## and the data table will become
> data
A B C B
1: A 1 0.15 15
2: A 1 0.22 22
3: A 1 0.30 30
4: B 1 0.15
5: B 1 0.22
6: B 1 0.30
7: C 2 0.15
8: C 2 0.22
9: C 2 0.30
问题是
nrow(DATA) > 6000000
和nrow(look) > 20000
,必须对3个新列进行操作,并且迭代已经运行了一天多了。所以我需要一种更有效的方法。
可能有更好的方法
data.table
或dlpyr
,但我还没有设法制定一个。