用相应的日均值替换缺失值
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
我想用当天的平均销售额替换一天的缺失销售额。因此 NA
在 12-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
的解决方案。我们可以使用 mutate
和 ifelse
来用 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]
我的数据集: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
我想用当天的平均销售额替换一天的缺失销售额。因此 NA
在 12-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
的解决方案。我们可以使用 mutate
和 ifelse
来用 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]