用一段时间内聚合的平均值替换 NA 值

Replacing NA values with the mean value aggregated over an interval

我有两个数据框。第一个是完整的数据集,其中包括 'step' 变量的 NA 值。数据框具有三个变量步骤、日期和间隔(这是一天值 0-2355 增加 5 的五分钟间隔)。第二个数据框是每个间隔的步骤的平均值。要重现数据帧,请使用以下代码:

#dat <- read.csv("activity.csv")
dat <- data.frame(steps = c(NA,16,5,3,8,NA),
                          date=c("2012-10-01","2012-10-01","2012-10-02",
                                 "2012-10-02","2012-10-03","2012-10-03"),
                          interval = c(0,5,0,5,0,5))
dat$date <- as.Date(dat$date, format='%Y-%m-%d')
steps_by_interval_df <- aggregate(steps ~ interval, dat[complete.cases(dat),], mean)

我现在想做的是将数据中的 NA 值替换为 steps_by_interval_df 中计算的平均步长,所以我执行了以下操作:

missing_steps_vect <- is.na(dat$steps)
dat$steps[missing_steps_vect] <- 
  steps_by_interval_df$steps[
    which(dat$interval[missing_steps_vect] == steps_by_interval_df$interval)]

这部分有效!所有 NA 值都替换为我为该间隔计算的平均值。这是我对自己的概念证明,因此我可以确保我编写的函数按计划运行。

问题是,如果我用我实际的 csv 读取代码替换第一行代码(请参阅注释掉的行),那么并不是所有的 NA 值都被替换。这似乎只替换了第一块 NA 值,而不是全部。我从大约 2300 个 NA 值开始,在 运行 之后我仍然有大约 2100 个我期望为 0 的函数。为什么代码适用于我创建的数据框但不适用于我从 read.csv?

如果您打算重现问题,您需要从 here 解压缩文件并指向 csv 文件以获取读取的 csv 文件。

免责声明:这是我正在服用的 class。我可能可以使用 for 循环轻松地做到这一点,只是为了让它工作,但我更愿意了解为什么这不起作用,而不是仅仅做一些不同的事情。

谢谢。

avezoo 包中的 na.aggregate 结合使用将为您提供所需的结果,并且比创建单独的函数容易得多:

library(zoo)
dat <- read.csv("activity.csv")
dat$date <- as.Date(dat$date, format='%Y-%m-%d')
dat$steps <- ave(dat$steps, dat$interval, FUN=na.aggregate)