ведущие / запаздывающие наблюдения вместе с вложенными данными - PullRequest
1 голос
/ 19 октября 2019

Я хочу создать новую переменную на основе

1. вложенного вектора текущего наблюдения

2. значений из текущих и других наблюдений.

Вот мой пример:


D <- tibble(team = c(101, 101, 101, 102, 102, 102),
            id = c(1, 2, 3, 1, 2, 3),
            x = c(3, 7, 5, 1, 4, 10),
            y = list(c(5,5,5), c(8,5,2), c(6,2,7), c(3,9,3), c(8,3,4), c(4,4,7)))

Я хочу создать новую переменную, равную

abs(y[1] - x[id==1]) + abs(y[2] - x[id==2]) + abs(y[3] - x[id==3])

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

Ожидаемый результат в этом примере будет z = c(4, 10, 10, 14, 14, 6)

Я попробовал что-то вроде group_by(team), за которым последовала попытка использовать map(), но я не могу найти ничего обещающего. Какое самое элегантное решение? Буду очень признателен за вашу помощь!

1 Ответ

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

Мы можем использовать map для циклического перемещения по столбцу list после группировки по 'team', а затем получить sum из abs абсолютной разницы между этим столбцом и 'x'

library(dplyr)
library(purrr)
D %>%
   group_by(team) %>%
    mutate(z = map_dbl(y, ~ sum(abs(.x -x)))) 
# A tibble: 6 x 5
# Groups:   team [2]
#   team    id     x y             z
#  <dbl> <dbl> <dbl> <list>    <dbl>
#1   101     1     3 <dbl [3]>     4
#2   101     2     7 <dbl [3]>    10
#3   101     3     5 <dbl [3]>    10
#4   102     1     1 <dbl [3]>    14
#5   102     2     4 <dbl [3]>    14
#6   102     3    10 <dbl [3]>     6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...