Я хотел бы выполнить вычисления во вложенном фрейме данных (хранящемся в виде столбца списка) и добавить вычисленную переменную обратно в каждый фрейм данных, используя функции purrr. Я буду использовать этот результат для присоединения к другим данным, и сохранение его компактности помогает мне лучше организовать и изучить его. Я могу сделать это за пару шагов, но похоже, что есть решение, с которым я еще не сталкивался. Если есть решение, мне нелегко его найти.
Загрузить библиотеки. для примера требуются следующие пакеты (доступны на CRAN):
library(dplyr)
library(purrr)
library(RcppRoll) # to calculate rolling mean
Примеры данных с 3 объектами и повторяющиеся измерения с течением времени:
test <- data_frame(
id= rep(1:3, each=20),
time = rep(1:20, 3),
var1 = rnorm(60, mean=10, sd=3),
var2 = rnorm(60, mean=95, sd=5)
)
Сохраните данные как вложенный фрейм данных:
t_nest <- test %>% nest(-id)
id data
<int> <list>
1 1 <tibble [20 x 3]>
2 2 <tibble [20 x 3]>
3 3 <tibble [20 x 3]>
Выполните расчеты. Я рассчитаю несколько новых переменных на основе данных, хотя решение только для одной можно было бы расширить позже. Результатом каждого вычисления будет числовой вектор той же длины, что и вход (n = 20):
t1 <- t_nest %>%
mutate(var1_rollmean4 = map(data, ~RcppRoll::roll_mean(.$var1, n=4, align="right", fill=NA)),
var2_delta4 = map(data, ~(.$var2 - lag(.$var2, 3))*0.095),
var3 = map2(var1_rollmean4, var2_delta4, ~.x -.y))
id data var1_rollmean4 var2_delta4 var3
<int> <list> <list> <list> <list>
1 1 <tibble [20 x 3]> <dbl [20]> <dbl [20]> <dbl [20]>
2 2 <tibble [20 x 3]> <dbl [20]> <dbl [20]> <dbl [20]>
3 3 <tibble [20 x 3]> <dbl [20]> <dbl [20]> <dbl [20]>
мое решение - это unnest
эти данные, а затем снова nest
. В этом нет ничего плохого, но похоже, что существует лучшее решение.
t1 %>% unnest %>%
nest(-id)
id data
<int> <list>
1 1 <tibble [20 x 6]>
2 2 <tibble [20 x 6]>
3 3 <tibble [20 x 6]>
Это другое решение (из SO 42028710) близок, но не совсем потому, что это список, а не вложенные фреймы данных:
map_df(t_nest$data, ~ mutate(.x, var1calc = .$var1*100))
Я нашел довольно много полезной информации с помощью purrr Cheatsheet, но не могу найти ответ.