экстраполируйте положение транспортного средства, добавив новые строки в тибблы

#r #tidyverse

#r #tidyverse

Вопрос:

У меня есть время t , скорость v и местоположение x транспортного средства, а также другая информация: info1, info2, status

Как я могу расширить тиббл, линейно экстраполируя положение на основе последней скорости (v = 14) для данного timestamps . Таким образом, добавленные строки являются копией последней строки, за исключением предсказанных позиций, и status изменены на «предсказанные»».

Можно ли это сделать без использования цикла.

  tbl lt;- tibble(info1 = rep("a", 3),  info2 = rep("b", 3),  t = c(1, 2, 3),  v = c(12, 13, 14),  x = c(12, 24, 37),   status = rep("real", 3))  timestamps lt;- c(4, 5, 6, 8) # timestamps does not linearly increase  # desired output tbl_desired lt;- tibble(info1 = rep("a", 7),  info2 = rep("b", 7),  t = c(1, 2, 3, 4, 5, 6, 8),  v = c(12, 13, 14, 14, 14, 14, 14),  x = c(12, 24, 37, 51, 65, 79, 107),   status = c(rep("real", 3), rep("predicted", 4)))  

Ответ №1:

Условия не ясны, особенно прогнозируемые значения в «x». Приведенный ниже код работает следующим образом

  1. Извлекает последнюю строку ( slice_tail , n = 1 )
  2. обновите столбцы «t», «v», «x» ( summarise )
  3. Свяжите строки из исходных данных ( bind_rows )
 library(dplyr) tbl %gt;%   slice_tail(n = 1) %gt;%   summarise(info1, info2, t = timestamps, v = v,   x = (x   cumsum(c(1, diff(t)) *   rep(last(v), length(t)))), status = 'predicted') %gt;%   bind_rows(tbl, .)  

-выход

 # A tibble: 7 × 6  info1 info2 t v x status   lt;chrgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;chrgt;  1 a b 1 12 12 real  2 a b 2 13 24 real  3 a b 3 14 37 real  4 a b 4 14 51 predicted 5 a b 5 14 65 predicted 6 a b 6 14 79 predicted 7 a b 8 14 107 predicted  

Если есть много столбцов, после slice ввода последней строки используйте mutate для обновления только те столбцы, которые необходимо изменить, и оберните list их, если значение length больше 1, затем unnest list столбец

 library(tidyr) tbl %gt;%   slice_tail(n = 1) %gt;%  mutate(t = list(timestamps), v = v,  x = list((x   cumsum(c(1, diff(timestamps)) *   rep(last(v), length(timestamps))))), status = 'predicted') %gt;%   unnest(where(is.list)) %gt;%   bind_rows(tbl, .)  

-выход

 # A tibble: 7 × 6  info1 info2 t v x status   lt;chrgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;chrgt;  1 a b 1 12 12 real  2 a b 2 13 24 real  3 a b 3 14 37 real  4 a b 4 14 51 predicted 5 a b 5 14 65 predicted 6 a b 6 14 79 predicted 7 a b 8 14 107 predicted  

Или используйте add_row , а затем fill NA строки с предыдущими не-NA для тех столбцов, которые не указаны в add_row

 library(tibble) tbl %gt;%   add_row(t = timestamps, v = last(.$v),   x = (last(.$x)   cumsum(c(1, diff(timestamps)) *   rep(last(.$v), length(timestamps)))), status = 'predicted') %gt;%   fill(everything())  

-выход

 # A tibble: 7 × 6  info1 info2 t v x status   lt;chrgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;chrgt;  1 a b 1 12 12 real  2 a b 2 13 24 real  3 a b 3 14 37 real  4 a b 4 14 51 predicted 5 a b 5 14 65 predicted 6 a b 6 14 79 predicted 7 a b 8 14 107 predicted  

Комментарии:

1. Спасибо, у меня более 50 колонок (не только info1, info2). Я мог бы показать это на примере. Есть ли способ дублировать, не записывая все столбцы.

2. @SiH Работает ли обновление для вас? Столбцы, подлежащие изменению, можно изменить только вручную, поскольку значения для этих столбцов и применяемых функций будут разными.

3. Я пытаюсь повторить шаги, но получаю ошибки — у меня 4 строки, и я добавляю 10 строк. lt;ошибка/tibble_error_incompatible_new_colsgt; Новые столбцы должны быть совместимы с lt;ошибка/tibble_error_incompatible_new_colsgt; .data . x Новые столбцы содержат 10 строк. у меня .data 4 ряда.

4. @SiH Я не знаю об ошибках. Все решения работают с данными, которые вы предоставили. т. е. я предоставил 3 решения

5. Да, add_row сработало, спасибо