У меня есть data.frame с координатами и групповой информацией, например:
set.seed(1)
df = data.frame(x=round(runif(6,1,100)), y=round(runif(6,100,200)), group=c("A", "A", "B", "B", "B", "A"))
Я хочу создать «различия» data.frame из всех комбинаций двух точек и вычислить разницу в координатах X в первом столбце и Y во втором столбце. Я придумал этот код, который, по-моему, абсолютно неэффективен:
comp.diff = function(H, data) {(data[H[1], 1:2]- data[H[2], 1:2])}
comb = df %>% nrow %>% combn(2) %>% {cbind(., .[2:1, ])} # make all combinations in both ways
apply(comb, 2, comp.diff, data = df) %>% do.call('rbind.data.frame', .)
Но я не могу добиться еще двух вещей:
- Я хочу вычислить (или сохранить) только различия пар точек, взятых из той же группы
- Я хотел бы сохранить для каждой строки в выходной матрице информацию о начальном x, начальном y и идентификаторе соответствующей группы.
Как я могу достичь этого эффективным способом (очевидно, количество комбинаций быстро растет с N ...) Спасибо
Структура ожидаемого результата (выдержка):
#### delta.x delta.y old.x old.y group
#### 1 -11 28 27 166 A
#### 5 -63 76 27 118 A
#### ...
str(df)
и сравните вывод с данными образца. 07.06.2018