通过插值从另一个表中插入一些匹配值来填充表

问题描述 投票:0回答:1

我有一个很长的表,其中包含 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
,但我还没有设法制定一个。

r dplyr data.table
1个回答
-2
投票

请检查以下文本是否有任何错误,并尽可能使其更清楚:

“[强调文本]”请检查以下文本是否有任何错误,并尽可能使其更清楚:

“[强调文字]”]1*

© www.soinside.com 2019 - 2024. All rights reserved.