【发布时间】:2016-03-24 06:54:53
【问题描述】:
我有两个数据框。第一个是完整的数据集,其中包括“step”变量的 NA 值。数据框具有三个变量步骤、日期和间隔(在日期值 0-2355 中以 5 分钟间隔增加 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 文件。
免责声明:这是针对我正在学习的课程。我可能可以很容易地用一个 for 循环来做到这一点,只是为了让它工作,但我更愿意了解为什么这不起作用,而不是仅仅做一些不同的事情。
谢谢。
【问题讨论】:
标签: r csv dataframe aggregation