Расширьте строку с помощью rowise() %>% do(), когда do () возвращает вектор

Как мне сделать этот код более аккуратным?

as_tibble(t(mapply(pmf, x=lhs$mu, y=lhs$sigma)))

Вот pmf() вспомогательная функция

pmf <- function(x, y) diff(pnorm(c(-Inf, -2, 0, 2, Inf), x, y))

Этот код берет среднее и стандартное отклонение от каждой строки и возвращает функцию вероятности массы (PMF) для каждого бина.

Так это

# A tibble: 6 x 4
i     j       mu    sigma
<int> <int>    <dbl>    <dbl>
  1     1     1 1.890402 2.879148
2     1     2 1.202357 2.655255
3     1     3 1.186224 2.127293
4     1     4 1.222278 2.228819
5     1     5 1.760214 2.324657
6     2     1 1.726712 2.574771

становится этим

# A tibble: 6 x 8
i     j       mu    sigma         V1        V2        V3        V4
<int> <int>    <dbl>    <dbl>      <dbl>     <dbl>     <dbl>     <dbl>
  1     1     1 1.890402 2.879148 0.08831027 0.1674140 0.2594582 0.4848175
2     1     2 1.202357 2.655255 0.11390009 0.2114385 0.2927260 0.3819354
3     1     3 1.186224 2.127293 0.06709483 0.2214568 0.3604183 0.3510301
4     1     4 1.222278 2.228819 0.07412598 0.2175836 0.3447228 0.3635676
5     1     5 1.760214 2.324657 0.05288144 0.1715857 0.3166106 0.4589223
6     2     1 1.726712 2.574771 0.07389306 0.1773358 0.2910357 0.4577354

после того, как я использую bind_cols() добавить обратно вывод.

Я попробовал следующее (используя тот же pmf() вспомогательная функция).

pmf <- function(x, y) diff(pnorm(c(-Inf, -2, 0, 2, Inf), x, y))
lhs %>% rowwise() %>% do(k = pmf(.$mu, .$sigma))

Но он возвращает PMF в виде списка. Я хотел бы, чтобы PMF в ряд. Это не работает для меня, потому что вниз по течению мне нужно применить функцию по строкам в каждом столбце V#,

Можно ли сделать этот расчет более аккуратным?

FWIW, вот полный расчет.

library(tidyverse)

# find PMF from mu and sigma
pmf <- function(x, y) diff(pnorm(c(-Inf, -2, 0, 2, Inf), x, y))

# find mean*variance for each column (i.e., PMF bin) __across rows___
mean_var <- function(x) mean(x)*var(x)

# here are my data
lhs <- tibble(i = rep(1:2, each=5),
              j = rep(1:5, times=2),
              mu = 1 + runif(2*5),
              sigma = 2 + runif(2*5))

# find PMF from mu and sigma
rhs <- as_tibble(t(mapply(pmf, x=lhs$mu, y=lhs$sigma)))

# downstream calculations
ans <- 
  lhs %>% 
  bind_cols(rhs) %>% 
  group_by(i) %>% 
  summarise_at(vars(starts_with('V')), funs(mean_var)) %>% 
  gather(bin, mean_var, -i) %>% 
  group_by(i) %>% 
  summarise(ambg = sum(mean_var))

# this finds PMF from mu and sigma, but as a list; I need a row
lhs %>% rowwise() %>% do(k = pmf(.$mu, .$sigma))

0 ответов

Другие вопросы по тегам