用相应的日均值替换缺失值

Replace missing values with corresponding day mean

我的数据集:MyData

     Day Sales
12-01-17    NA
12-01-17    NA
13-01-17    13
14-01-17    2
12-01-17    33
13-01-17    NA
13-01-17    NA
13-01-17    NA
14-01-17    11
12-01-17    23
13-01-17    21
14-01-17    NA

我想用当天的平均销售额替换一天的缺失销售额。因此 NA12-01-2017 上的平均值为 33、23,即 28。

我试过的R代码是这样的。这里 MyData_NA 只有 Sales = NA 的行,MyData_Daymean 有按天分组的平均销售额。

for (i in 1:nrow(MyData_NA)){if (MyData_NA[i,day] == MyData_Daymean[i,1])
{ MyData_NA[i,2] <- MyData_Daymean[i,2] }}

这似乎不起作用。

使用 dplyr 的解决方案。我们可以使用 mutateifelse 来用 NA 替换缺失值。关键是在同一个 Day 上使用 group_by,因此平均计算将仅针对该组。

library(dplyr)

dt2 <- dt %>%
  group_by(Day) %>%
  mutate(Sales = ifelse(is.na(Sales), mean(Sales, na.rm = TRUE), Sales)) %>%
  ungroup()
dt2
# # A tibble: 9 x 2
#        Day Sales
#     <fctr> <dbl>
# 1 12-01-17  28.0
# 2 13-01-17  13.0
# 3 14-01-17   2.0
# 4 12-01-17  33.0
# 5 13-01-17  17.0
# 6 14-01-17  11.0
# 7 12-01-17  23.0
# 8 13-01-17  21.0
# 9 14-01-17   6.5

数据

dt <- read.table(text = "     Day Sales
12-01-17    NA
                 13-01-17    13
                 14-01-17    2
                 12-01-17    33
                 13-01-17    NA
                 14-01-17    11
                 12-01-17    23
                 13-01-17    21
                 14-01-17    NA",
                 header = TRUE)

我们也可以使用 zoo

中的 na.aggregate
library(zoo)
dt$Sales <-  with(dt, ave(Sales, Day, FUN = na.aggregate))
dt$Sales
#[1] 28.0 13.0  2.0 33.0 17.0 11.0 23.0 21.0  6.5

或者 data.table 假设 'Sales' 是 numeric 类型

library(data.table)
setDT(dt)[, Sales := na.aggregate(Sales), Day]