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

问题描述 投票:0回答:1

这个好像应该很简单,但是我看不到。

假设我有一个数据框,比如。

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中省略一些 "als"(例如,其中 "stage "等于1 OR stage等于2--或任何其他条件)。使用 dplyrzoo 很容易填入组均值,但我无法解决如何根据 "阶段 "中的条件从组中排除变量。

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

但我不知道如何根据 "阶段 "中的条件 将变量从组中排除出去。理想的情况下,一个dplyr的解决方案,但包括动物园也将是不错的。

r replace dplyr na
1个回答
1
投票

你可以用以下的条件来实现它 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.

创建于2020-05-08 重读包 (v0.3.0)

我把种子设置为一个数字,所以每个人得到的数字都是一样的。

© www.soinside.com 2019 - 2024. All rights reserved.