R суммирует дважды вложенный список, используя purrr - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть data.frame со следующими размерами: Вывод: as_tibble(data2)

lamda meanlog sdlog freq      freqsev   
<dbl>   <dbl> <dbl> <list>    <list>    
1     5       9   2   <int [4]> <list [4]>
2     2      10   2.1 <int [4]> <list [4]>
3     3      11   2.2 <int [4]> <list [4]>

, где freqsev - это список значений длины freq, иfreq сам по себе является списком значений длины s, где s - количество симуляций.

library(tidyverse)
set.seed(123)
s <- 5
data <- data.frame(lamda = c(5, 2, 3), meanlog = c(9, 10, 11), sdlog = c(2, 2.1, 2.2))

data2 <- data %>% mutate(
  freq = map(lamda, ~rpois(s, .x)),
  freqsev = map(freq, ~map(.x, function(k) rlnorm(k, meanlog, sdlog)))
  )

Я хотел бы сложить freqsev (получая <dbl [4]>, где [4] является индексом s), т. Е. Суммой по числу freq вхождений, например

Для data2$freqsev[[1]][[1]] Я ожидаю сумму.

Как этого можно достичь?Спасибо.

1 Ответ

0 голосов
/ 01 февраля 2019

Если честно, это действительно сложный способ хранения ваших данных, и вам, вероятно, было бы лучше использовать unnest() после создания столбца freq.Однако вы можете получить суммы векторов freqsev следующим образом:

data2 <- data %>% mutate(
  freq = map(lamda, ~rpois(s, .x)),
  freqsev = map(freq, ~map(.x, function(k) rlnorm(k, meanlog, sdlog))),
  freqsum = map(freqsev, ~map_dbl(.x, ~sum(.x)))
)

Поскольку freqsev - это список с двойным вложением, вам также необходимо дважды отобразить операцию суммирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...