используя R dplyr, замените NA на среднее значение группы, но опуская некоторые значения из группы перед вычислением среднего - PullRequest
0 голосов
/ 08 мая 2020

Кажется, это должно быть просто, но я этого не вижу.

Допустим, у меня есть фрейм данных, например:

df <- data.frame(type=c(rep("A", 5), rep("B",5)),
                 stage=rep(c("1","2", "3", "4", "5"),2),
                 val=c(rnorm(n=5, mean=1000, sd=300),rnorm(n=4, mean=1000, sd=100), NA)
                 )

Я хочу иметь возможность заменить NA в группе type=="B" средним значением группы B, но опустить некоторые «валы» из B (например, где «стадия» равна 1 ИЛИ стадия равна 2 - или любому другому условию). Используя dplyr и zoo, его легко заполнить средним значением группы:

df %>% dplyr::group_by(type) %>% dplyr::mutate_at("val", zoo::na.aggregate) 

, но я не могу понять, как исключить vals из группы на основе условия в "stage". В идеале, решение dplyr, но включая зоопарк, тоже было бы хорошо.

1 Ответ

1 голос
/ 08 мая 2020

Вот как вы могли бы сделать это с условием stage != 2:

library(tidyverse)

set.seed(12345)
df <- data.frame(type=c(rep("A", 5), rep("B",5)),
                 stage=rep(c("1","2", "3", "4", "5"),2),
                 val=c(rnorm(n=5, mean=1000, sd=300),rnorm(n=4, mean=1000, sd=100), NA)
)



df %>% 
  group_by(type) %>% 
  mutate(val = replace_na(val, mean(val[stage != 2], na.rm = TRUE)))
#> # A tibble: 10 x 3
#> # Groups:   type [2]
#>    type  stage   val
#>    <fct> <fct> <dbl>
#>  1 A     1     1176.
#>  2 A     2     1213.
#>  3 A     3      967.
#>  4 A     4      864.
#>  5 A     5     1182.
#>  6 B     1      818.
#>  7 B     2     1063.
#>  8 B     3      972.
#>  9 B     4      972.
#> 10 B     5      921.

Создано 08.05.2020 с помощью пакета REPEX (v0.3.0 )

Я устанавливаю начальное число на число, чтобы все получали одинаковые числа.

...