Рассчитать разницу между одним наблюдением и всеми другими наблюдениями по группам - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь создать Расстояние между первым наблюдением и всеми другими наблюдениями в группе. Первое наблюдение в группе A - это a1, а в группе B - b1.

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

 df <- data.table(Section = rep(c('A', 'B'), each = 4),
                                 ID = c('a1','a2','a3','a4','b1','b2','b3','b4'),
                                  x = c(5,10,15,15,10,15,30,25),
                                  y = c(12,10,8,4,6,8,16,24))

Где вычисление расстояния будет евклидовым [a1, a2] = sqrt ((x1-x2) ^ 2 + (y1-y2) ^ 2). Первое значение в каждой группе будет 0. Я надеюсь сделать это с помощью dplyr или data.table. Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Два решения с dplyr:

(1) по формуле евклидова расстояния

df %>% group_by(Section) %>%
  mutate(Euclidean = sqrt((x - x[1])^2 + (y - y[1])^2))

(2) По базовой функции dist()

df %>% group_by(Section) %>%
  mutate(Euclidean = as.matrix(dist(cbind(x, y)))[1, ])

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


Выход:

#   Section ID        x     y Euclidean
#   <chr>   <chr> <dbl> <dbl>     <dbl>
# 1 A       a1        5    12      0   
# 2 A       a2       10    10      5.39
# 3 A       a3       15     8     10.8 
# 4 A       a4       15     4     12.8 
# 5 B       b1       10     6      0   
# 6 B       b2       15     8      5.39
# 7 B       b3       30    16     22.4 
# 8 B       b4       25    24     23.4
0 голосов
/ 08 января 2019

Ты имеешь в виду что-то подобное?

setDT(df)[, Distance := sqrt((x[1]-x)^2+(y[1]-y)^2), .(Section)]
...