Arhn - архитектура программирования

Вычислить различия X и Y для всех пар точек по группам, сохраняя исходные столбцы

У меня есть 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
#### ...

  • f должно быть comp.diff? 07.06.2018
  • @Jimbou последняя строка df также принадлежит группе A 07.06.2018
  • а как рассчитывается? df$x в group == "A" состоит из c(58, 27, 38). Итак, как получить результат -63. Второй вопрос: какую из двух ценностей вы хотите сохранить. Первое или второе? 07.06.2018
  • @Jimbou может снова запустить начальный df? У меня c (27, 38, 90) для x в группе A. Второй вопрос (хороший :-)) Думаю, это не имеет значения, потому что в определении comb я вычисляю различия в обоих направлениях (xi-xj) И (xj-xi) 07.06.2018

Ответы:


1

Ты можешь попробовать

library(tidyverse)
# calculate the combinations per group
combs <- df %>% 
  split(.$group) %>% 
  map(~combn(1:nrow(.),2)) 

# the calcualtion
df %>% 
  mutate(index=1:n()) %>% 
  split(.$group) %>% 
  map2(combs, ., ~data.frame(t(apply(.x, 2, function(i) 
    cbind(paste(.y$index[i], collapse = "-"),
          .y$x[i[1]],.y$x[i[2]],.y$y[i[1]],.y$y[i[2]],
          -diff(.y$x[i]), -diff(.y$y[i])))),stringsAsFactors = F)) %>% 
  bind_rows(.id = "group") %>% 
  dplyr::select(1, index_diff=2, 
                x1_old=3, x2_old=4,
                y1_old=5, y2_old=6,
                diff_x=7,diff_y=8)

Редактировать

и все вместе в одном конвейере, включая преобразование в целые числа

df %>% 
  mutate(index=1:n()) %>% 
  split(.$group) %>% 
  map(~data.frame(t(apply(combn(1:nrow(.),2), 2, function(i) 
    cbind(paste(.$index[i], collapse = "-"),
          .$x[i[1]],.$x[i[2]],.$y[i[1]],.$y[i[2]],
          -diff(.$x[i]), -diff(.$y[i])))),stringsAsFactors = F)) %>% 
  bind_rows(.id = "group") %>% 
  dplyr::select(1, index_diff=2, 
                x1_old=3, x2_old=4,
                y1_old=5, y2_old=6,
                diff_x=7,diff_y=8) %>% 
  mutate_at(vars(x1_old:diff_y), as.numeric) %>% 
  as.tibble()
# A tibble: 6 x 8
  group index_diff x1_old x2_old y1_old y2_old diff_x diff_y
  <chr> <chr>       <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 A     1-2            27     38    194    166    -11     28
2 A     1-6            27     90    194    118    -63     76
3 A     2-6            38     90    166    118    -52     48
4 B     3-4            58     91    163    106    -33     57
5 B     3-5            58     21    163    121     37     42
6 B     4-5            91     21    106    121     70    -15
07.06.2018
  • С образцами данных? Нет, он здесь работает. Отметьте str(df) и сравните вывод с данными образца. 07.06.2018
  • хорошо, это действительно хорошо работает, результаты кажутся правильными, и, кроме того, намного быстрее, чем мой код. Спасибо, это действительно мне помогло! 07.06.2018
  • это еще одна деталь (но легко исправить) выходные столбцы в символьном формате 07.06.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..