我有两个数据框。第一个是完整数据集,其中包括“步骤”的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循环轻松地做到这一点,只是为了使它工作,但我更愿意了解为什么这不起作用而不只是做一些不同的事情。
感谢。
答案 0 :(得分:1)
将ave
与na.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)