мутировать на вложенном столбце - PullRequest
0 голосов
/ 04 января 2019

У меня есть вложенное tibble в следующей форме:

library(purrr)
library(dplyr)

ex <- tibble(data = list(val = rnorm(12), 
                         val = rnorm(5), 
                         val = rep(NA, 5), 
                         val = c(rnorm(3), NA)), 
               p1 = rnorm(4),
               p2 = rnorm(4)) %>% 
         mutate(data = map(data, tibble))

и я хотел бы, чтобы новый столбец заполнялся значениями p , рассчитанными из ks.test для каждого tibble в data по сравнению с нормальным распределением, параметры которого хранятся в p1 и p2.

Я пробовал что-то вроде

ex %>%
   mutate(ks_test = map(data, 
             ~tryCatch( #to avoid problems with tibbles filled only by NAs
                ks.test(x = .$val,
                        y = "pnorm",
                        mean = .$p1,
                        sd = .$p2), 
              error = function(e) list(p.value = NA))),
           ks_pvalue = map_dbl(ks_test, "p.value"))

который, к сожалению, не в состоянии выполнить тест, предоставляя только NA.

Пожалуйста, вы можете помочь мне исправить этот кусок кода? Спасибо.

1 Ответ

0 голосов
/ 04 января 2019

Я отошлю вас к purrr::possibly для рассмотрения ваших дел по НС. Что касается обработки векторов, которые завершены, то это помогает иметь столбец группировки, в который можно вложить. Также специальная функция для ks_test помогает содержать вещи в чистоте.

library(purrr)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyverse)


val1 = data.frame(val = rnorm(12), group = 1)
val2 = data.frame(val = rnorm(5), group = 2)

ks_test_fun <- function(data, p1, p2, ...){
  data %>% 
  ks.test(x = .$val, y = "pnorm", mean = p1, sd = p2) %>% 
  broom::tidy() %>% 
  pull(p.value)
}

set.seed(4)
rbind(val1, val2) %>% 
  group_by(group) %>% 
  nest() %>% 
  mutate(p1 = rnorm(2), p2 = rnorm(2)) %>% 
  mutate(ks_test_pval = map(data, ks_test_fun, p1, p2)) %>% 
  unnest(ks_test_pval)
#> # A tibble: 2 x 5
#>   group data                  p1    p2 ks_test_pval
#>   <dbl> <list>             <dbl> <dbl>        <dbl>
#> 1     1 <tibble [12 x 1]>  0.217 0.891        0.137
#> 2     2 <tibble [5 x 1]>  -0.542 0.596        0.333

Создано в 2019-01-04 пакетом представ. (v0.2.1)

...