用过滤器按组替换 NA 值的平均值
Replace NA values with average by group with filter
我有以下数据集:
head(weather_data)
dmanum DATE Avg_precipitation Avg_TAVG
<chr> <date> <dbl> <dbl>
1 501 2017-01-01 0.000976 45.3
2 501 2017-01-02 NA 39.3
3 501 2017-01-03 0.366 42
4 502 2017-01-01 NA 46
5 502 2017-01-02 NA 33.3
6 502 2017-01-03 NA 31.3
7 503 2017-01-01 5 46
8 503 2017-01-02 10 33.3
9 503 2017-01-03 15 31.3
具有相同日期的 dmanum 有多个值。根据我对 dmanum 的选择,我想按周取平均值 Avg_precipitation
并替换该特定 DMA 的 NA。
例如,如果我要使用此数据集,我会尝试这样的操作,但出现错误:
weather_data1<- weather_data %>%
group_by(DATE) %>%
filter(., dmanum==502) %>%
mutate_at(Avg_precipitation = na.fill(mean(Avg_precipitatation))
预期的输出是这样的:
dmanum DATE Avg_precipitation Avg_TAVG
<chr> <date> <dbl> <dbl>
1 501 2017-01-01 0.000976 45.3
2 501 2017-01-02 NA 39.3
3 501 2017-01-03 0.366 42
4 502 2017-01-01 2.5004 46
5 502 2017-01-02 10 33.3
6 502 2017-01-03 7.683 31.3
7 503 2017-01-01 5 46
8 503 2017-01-02 10 33.3
9 503 2017-01-03 15 31.3
我们可以在group_by
之后使用replace
。而不是 filter
ing 行,在 replace
的 list
参数中指定逻辑以仅替换那些 NA
s 其中 'dmanum' 是 502
library(tidyverse)
weather_data %>%
group_by(DATE) %>%
mutate(Avg_precipitation = replace(Avg_precipitation,
is.na(Avg_precipitation) & dmanum == 502,
mean(Avg_precipitation, na.rm = TRUE)))
# A tibble: 9 x 4
# Groups: DATE [3]
# dmanum DATE Avg_precipitation Avg_TAVG
# <int> <date> <dbl> <dbl>
#1 501 2017-01-01 0.000976 45.3
#2 501 2017-01-02 NA 39.3
#3 501 2017-01-03 0.366 42
#4 502 2017-01-01 2.50 46
#5 502 2017-01-02 10 33.3
#6 502 2017-01-03 7.68 31.3
#7 503 2017-01-01 5 46
#8 503 2017-01-02 10 33.3
#9 503 2017-01-03 15 31.3
我有以下数据集:
head(weather_data)
dmanum DATE Avg_precipitation Avg_TAVG
<chr> <date> <dbl> <dbl>
1 501 2017-01-01 0.000976 45.3
2 501 2017-01-02 NA 39.3
3 501 2017-01-03 0.366 42
4 502 2017-01-01 NA 46
5 502 2017-01-02 NA 33.3
6 502 2017-01-03 NA 31.3
7 503 2017-01-01 5 46
8 503 2017-01-02 10 33.3
9 503 2017-01-03 15 31.3
具有相同日期的 dmanum 有多个值。根据我对 dmanum 的选择,我想按周取平均值 Avg_precipitation
并替换该特定 DMA 的 NA。
例如,如果我要使用此数据集,我会尝试这样的操作,但出现错误:
weather_data1<- weather_data %>%
group_by(DATE) %>%
filter(., dmanum==502) %>%
mutate_at(Avg_precipitation = na.fill(mean(Avg_precipitatation))
预期的输出是这样的:
dmanum DATE Avg_precipitation Avg_TAVG
<chr> <date> <dbl> <dbl>
1 501 2017-01-01 0.000976 45.3
2 501 2017-01-02 NA 39.3
3 501 2017-01-03 0.366 42
4 502 2017-01-01 2.5004 46
5 502 2017-01-02 10 33.3
6 502 2017-01-03 7.683 31.3
7 503 2017-01-01 5 46
8 503 2017-01-02 10 33.3
9 503 2017-01-03 15 31.3
我们可以在group_by
之后使用replace
。而不是 filter
ing 行,在 replace
的 list
参数中指定逻辑以仅替换那些 NA
s 其中 'dmanum' 是 502
library(tidyverse)
weather_data %>%
group_by(DATE) %>%
mutate(Avg_precipitation = replace(Avg_precipitation,
is.na(Avg_precipitation) & dmanum == 502,
mean(Avg_precipitation, na.rm = TRUE)))
# A tibble: 9 x 4
# Groups: DATE [3]
# dmanum DATE Avg_precipitation Avg_TAVG
# <int> <date> <dbl> <dbl>
#1 501 2017-01-01 0.000976 45.3
#2 501 2017-01-02 NA 39.3
#3 501 2017-01-03 0.366 42
#4 502 2017-01-01 2.50 46
#5 502 2017-01-02 10 33.3
#6 502 2017-01-03 7.68 31.3
#7 503 2017-01-01 5 46
#8 503 2017-01-02 10 33.3
#9 503 2017-01-03 15 31.3