Фильтр R для удаления строк в функции карты - PullRequest
2 голосов
/ 07 апреля 2019

Я моделирую события из следующей таблицы data, используя функцию map и отфильтровываю zero значение события.

Однако я бы хотел выполнить фильтрацию внутри функции map, уменьшив тем самым размер создаваемой таблицы event.

Следующее имитирует events на основе распределения Пуассона для заданного среднего значения (оно включает freq = 0, но для управления памятью я этого не хочу):

library(tidyverse)
set.seed(1); n <- 10
data <- tibble(locid = seq(5), exp = 2)

event <- data %>% 
    mutate(freq = map(exp, ~rpois(n, .x))) %>%
    mutate(freq = map(freq, ~ data.frame(freq = .x, sim = seq_along(.x)))) %>%
    unnest()

Затем я могу отфильтровать с помощью event %>% filter(freq != 0). Как я могу вставить это в функцию map, пожалуйста? Это сделает объем памяти более управляемым для моего кода. Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Вот одна идея. Не нужно создавать data.frame. Создайте list с freq и sim, а затем unnest их.

library(tidyverse)
set.seed(1); n <- 10
data <- tibble(locid = seq(5), exp = 2)

event <- data %>% 
  mutate(freq = map(exp, ~rpois(n, .x)),
         sim = map(freq, ~which(.x > 0)),
         freq = map(freq, ~.x[.x > 0]))%>%
  unnest()
event
# # A tibble: 45 x 4
#    locid   exp  freq   sim
#    <int> <dbl> <int> <int>
#  1     1     2     1     1
#  2     1     2     1     2
#  3     1     2     2     3
#  4     1     2     4     4
#  5     1     2     1     5
#  6     1     2     4     6
#  7     1     2     4     7
#  8     1     2     2     8
#  9     1     2     2     9
# 10     2     2     1     1
# # ... with 35 more rows
2 голосов
/ 07 апреля 2019

Опция будет discard

library(tidyverse)
data %>% 
    mutate(freq = map(exp, ~rpois(n, .x) %>%
                           discard(. == 0) %>%
                           tibble(freq = ., sim = seq_along(.)))) %>% 
    unnest

если 'sim' должен быть основан на исходной последовательности, то создать tibble выходных данных 'rpois' и последовательности элементов, затем выполнить filter в пределах map

data %>% 
    mutate(freq = map(exp, ~ rpois(n , .x)  %>% 
                               tibble(freq = ., sim = seq_along(.))  %>% 
                               filter(freq != 0))) %>%
    unnest

Или используя mutate между

 data %>% 
     mutate(freq = map(exp, ~  tibble(freq = rpois(n, .x)) %>% 
                                  mutate(sim = row_number()) %>% 
                                  filter(freq != 0))) %>%
     unnest
...