R:当x是列的名称并且y是行时,插值数据表。

时间:2017-01-25 21:11:32

标签: r performance data.table

让我举例说明:

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?

可能会更好

1 个答案:

答案 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