#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». Приведенный ниже код работает следующим образом
- Извлекает последнюю строку (
slice_tail
,n = 1
) - обновите столбцы «t», «v», «x» (
summarise
) - Свяжите строки из исходных данных (
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
сработало, спасибо