R data.table: ролл указывает на сетку - PullRequest
2 голосов
/ 08 октября 2019

В настоящее время я пытаюсь использовать опцию roll of data.table для объединения двух таблиц, потому что я прочитал, что это действительно красиво и эффективно. К сожалению, как бы я ни старался, я всегда получаю неправильные результаты. Либо у меня много таблиц NA в итоговой таблице данных, либо у меня неправильные значения, либо я просто получаю сообщение об ошибке, что объединение невозможно.
Что делает вещи немного более сложными, чем задокументированный обычный случай временных рядов, иповсюду объясняется, что мне нужно сделать рулон 2D. Это означает, что у меня есть точки в 2d (представьте в качестве примера пиксели изображения), которые я хочу свернуть в 2D-сетку.
Ниже вы найдете краткий пример кода того, чего я пытаюсь достичь. Опубликованная версия соответствует ожиданиям, основанным на этом ответе: R: сопоставление координат из одного (большого) фрейма данных в ячейки сетки из другого (большого) фрейма данных , но я получаю ошибкусообщение. Я могу исправить эту ошибку, удалив точки сетки из данных, но это не то, к чему я стремлюсь, а также не дает желаемого результата (см. Проверку в последней строке).

data = data.table(CJ(
  x = seq(0,10,0.1),
  y = seq(0,10,0.1)
))

grid = data.table(CJ(
  x = seq(0,10,1),
  y = seq(0,10,1)
))

grid[, label := x*y]

setkey(data, x)
setkey(grid, x)
intermediate = grid[data, roll = Inf][, list(x,y = i.y,label)]

setkey(intermediate, y)
setkey(grid, y)
result = grid[intermediate, roll = Inf][, list(x = i.x, y, label)]
unique(result$label == floor(result$x)*floor(result$y))

Я знаю, что в этом примере я мог бы просто сделать

data[, label := floor(x)*floor(y)]

, но в настройке, которую я хочу использовать в рулоне, метка вычисляется сложным процессом насетка, которая не может быть легко применена к самим данным.

Если кто-то может сказать мне, как получить желаемый результат, и, возможно, также указать, где я ошибся, пытаясь применить ответ, связанный выше, чтобыло бы действительно здорово.

1 Ответ

1 голос
/ 09 октября 2019

Я думаю, что сложность заключается в том, что другой вопрос имеет уникальные координаты X и уникальные координаты Y, тогда как в этом случае для каждого X есть несколько значений Y.

Вот еще один подход к использованию одного и того же скользящегоприсоединиться и сразу же отфильтровать для grid$Y ниже data$Y, а затем выбрать самый большой из таких grid$Y:

data[, c("cX", "cY") := .(X, Y)]
result <- grid[data, on=.(X), roll=Inf, by=.EACHI, 
    .(X=cX, Y=cY, LABEL=last(LABEL[x.Y<=i.Y]))][, (1) := NULL]

result:

        X    Y LABEL
    1:  0  0.0     0
    2:  0  0.1     0
    3:  0  0.2     0
    4:  0  0.3     0
    5:  0  0.4     0
   ---              
10197: 10  9.6    90
10198: 10  9.7    90
10199: 10  9.8    90
10200: 10  9.9    90
10201: 10 10.0   100

проверить:

result[abs(LABEL - floor(X)*floor(Y)) > 1e-10]
#Empty data.table (0 rows and 3 cols): X,Y,LABEL

данные:

library(data.table)
data = data.table(CJ(X=seq(0,10,0.1), Y=seq(0,10,0.1)))
grid = data.table(CJ(X=seq(0,10,1), Y=seq(0,10,1)))[, LABEL := X*Y]
...