Расширьте строку с помощью 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))