Использование pmap для подмножества столбцов - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть три столбца списка в таблице: x, left и right. Очень просто, я хочу знать, находится ли элемент в j-й позиции x между j-ю элементами left и right. Вот код, который я написал до сих пор:

library(tidyverse)
library(binom)


params = crossing(p = seq(0.05,0.5,0.05), size = 10:100, n = 50)

simulation.results = params %>% 
                      mutate(x = pmap(., rbinom)) %>% 
                      select(-n) %>% 
                      mutate(left = map2(x,size,~binom.agresti.coull(.x,.y)$lower),
                             right = map2(x,size, ~binom.agresti.coull(.x,.y)$upper),
                             coverage = pmap_lgl(list(x = x, left = left, right = right), between) #Problem here
                             )

Я получаю ошибку

#> Error in mutate_impl(.data, dots): Evaluation error: Expecting a single value: [extent=50]..

хотя я уверен, что правильно использую синтаксис. Меньший пример, кажется, работает

library(tidyverse)

x = c(1,2,3)
y = c(4,5,6)
z = c(2,3,4)

pmap_lgl(list(x = x,left = y, right = z), between)
#> [1] FALSE FALSE FALSE

Как определить, какие элементы x находятся между left и right, используя purrr? Что я сделал не так и как я могу избежать этого в будущем?

1 Ответ

0 голосов
/ 14 сентября 2018

Столбцы 'x', 'left' и 'right' являются list столбцами с длиной каждого элемента> 1, но between аргумент 'left' и 'right' принимает только вектор длины 1. В порядке чтобы сделать это, мы можем либо расширить набор данных на unnest с элементами list, а затем применить pmap

params %>%
  mutate(x = pmap(., rbinom)) %>% 
  select(-n) %>% 
  mutate(left = map2(x, size, ~  
                      binom.agresti.coull(.x, .y)$lower), 
         right = map2(x,size,  ~
                       binom.agresti.coull(.x,.y)$upper)) %>%
  unnest %>% 
  mutate(coverage = pmap_lgl(list(x, left, right), between))

Или вместо between мы можем использовать операторы сравнения, сохраняя структуру list

params %>% 
   mutate(x = pmap(., rbinom)) %>%
   select(-n) %>% 
   mutate(left = map2(x, size, ~
               binom.agresti.coull(.x, .y)$lower), 
          right = map2(x,size, ~
               binom.agresti.coull(.x,.y)$upper), 
          coverage = pmap(list(x, left, right), ~ ..1 > ..2 & ..1 < ..3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...