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

时间:2015-12-17 17:32:29

标签: r csv dataframe aggregation

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

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值替换为steps_by_interval_df中计算的平均步数,因此我执行了以下操作:

<Data a="a" b="b" c="c" d="d"><Date runDt="01-01-1900" /></Data>

这部分有效!所有NA值都替换为我为该间隔计算的平均值。这是我对自己的概念证明,以便我可以确保我写的功能按计划工作。

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

如果您计划重新创建问题,则需要从here解压缩文件并指向读取csv文件的csv文件。

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

感谢。

1 个答案:

答案 0 :(得分:1)

avena.aggregate包中的zoo结合使用,可以获得所需的结果,并且比创建单独的函数容易得多:

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)