使用R dplyr将NA替换为组平均值,但在计算平均值之前省略了组中的一些值



这看起来应该很简单,但我看不到。

假设我有一个类似的数据帧

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)
)

我希望能够用组B的平均值替换组type=="B"中的NA,但从B中省略一些"vals"(例如,其中"stage"等于1或stage等于2-或任何其他条件(。使用dplyrzoo,其易于用组平均值填充:

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

但我不知道如何根据"阶段"的条件将vals排除在组之外。理想情况下,一个dplyr解决方案,但包括动物园也会很好。

这就是使用条件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.

由reprex包(v0.3.0(于2020-05-08创建

我把种子设定为一个数字,这样每个人都能得到相同的数字。

最新更新