簡體   English   中英

使用 R dplyr 將 NA 替換為組平均值,但在計算平均值之前省略組中的一些值

[英]using R dplyr replace NA with group mean but omitting some values from group before mean calculation

這似乎應該是一個簡單的,但我看不到它。

假設我有一個 dataframe 像:

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) 

但我不知道如何根據“階段”中的條件從組中排除 val。 理想情況下,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.

代表 package (v0.3.0) 於 2020 年 5 月 8 日創建

我將種子設置為一個數字,這樣每個人都會得到相同的數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM