让我举例说明:
library(data.table)
A <- data.table( value = c(1.3,2.1,2.7), '1' = c(0.4,0.3,0.5), '2' = c(1.1,1.3,1.7) , '3' = c(2.1,2.4,2.6) )
> A
value 1 2 3
1: 1.3 0.4 1.1 2.1
2: 2.1 0.3 1.3 2.4
3: 2.7 0.5 1.7 2.6
我想用x = 1,2,3和y作为每一行来插入列中的数字&#34;值&#34;。
因此,对于第一行,x = 1,2,3和y = 0.4,1.1,2.1。应该插值的值是x0 = 1.3。等等下一行。我想出了以下函数来使用data.table by rows:
来应用它## Function to Interpolate
interpol <- function(dt){
# Define X
x <- c(1,2,3)
# Grab each row of the data.table
y <- as.numeric(dt[,c('1','2','3'), with = F])
# Interpolate and get the value of Y
approx(x,y,dt[,'value', with = F])$y
}
# Apply by row
A[, interpol(.SD), by = 1:nrow(A)]
问题是对于几百万行的data.table来说,这似乎非常慢。优化这个的最佳方法是什么?
最初,我的问题如下:
我不得不使用不同的表B插入相同的A:
A2 <- data.table(name = LETTERS[1:3], value = c(1.3,2.1,2.7))
B2 <- data.table(name = LETTERS[1:3], '1' = c(0.4,0.3,0.5), '2' = c(1.1,1.3,1.7) , '3' = c(2.1,2.4,2.6) )
> A2
name value
1: A 1.3
2: B 2.1
3: C 2.7
> B2
name 1 2 3
1: A 0.4 1.1 2.1
2: B 0.3 1.3 2.4
3: C 0.5 1.7 2.6
我决定合并这两个data.tables以获得上面的那个,因为我相信它会更容易。但也许为了让它运行得更快,将它们作为单独的data.tables?
可能会更好答案 0 :(得分:1)
首先,我建议以长格式存储> GET /model?query=x
< {}
数据:
B2
从这里开始,您可以加入dat = melt(B2, id="name", value.name = "v")
dat[, variable := as.numeric(as.character(variable))]
name variable v
1: A 1 0.4
2: B 1 0.3
3: C 1 0.5
4: A 2 1.1
5: B 2 1.3
6: C 2 1.7
7: A 3 2.1
8: B 3 2.4
9: C 3 2.6
按组进行插值:
A2