这个好像应该很简单,但是我看不到。
假设我有一个数据框,比如。
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--或任何其他条件)。使用 dplyr
和 zoo
很容易填入组均值,但我无法解决如何根据 "阶段 "中的条件从组中排除变量。
df %>% dplyr::group_by(type) %>% dplyr::mutate_at("val", zoo::na.aggregate)
但我不知道如何根据 "阶段 "中的条件 将变量从组中排除出去。理想的情况下,一个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.
创建于2020-05-08 重读包 (v0.3.0)
我把种子设置为一个数字,所以每个人得到的数字都是一样的。