【问题标题】:using R dplyr replace NA with group mean but omitting some values from group before mean calculation使用 R dplyr 将 NA 替换为组平均值,但在计算平均值之前从组中省略一些值
【发布时间】:2020-05-08 13:46:53
【问题描述】:

这似乎应该是一个简单的,但我看不到它。

假设我有一个像这样的数据框:

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。理想情况下,包含 zoo 的 dplyr 解决方案也很好。

【问题讨论】:

  • 抱歉应该补充一下,我希望所有值都保留在 df 中,只替换了 NA
  • 您可以拆分数据集并将它们合并两个部分,问题是当您未用于计算平均值的部分中缺少变量时会发生什么

标签: r replace dplyr na


【解决方案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.

reprex package (v0.3.0) 于 2020 年 5 月 8 日创建

我将种子设置为一个数字,这样每个人都会得到相同的数字。

【讨论】:

  • 谢谢,这正是我所追求的 - 无法确定将子集位放在哪里。
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多