我有一个数据框,其中包括日期,时间和几天内的测量值。
部分测量值为NA。我想用推算值替换它们。
为了解决这个问题,我创建了第二个数据帧来保存插补值:
meanMeasurementByTimeAndDayOfWeek <-
ddply(activityData, c('timeofday', 'dayOfWeek'),
summarize, avgMeasurement = mean(measurement, na.rm=TRUE))
(我认为这是对的。)
如何根据timeofday和dayOfWeek值将第二个数据框中的avgMeasurement值替换为activityData数据帧的测量列中的NA?
答案 0 :(得分:3)
我们可以在不创建新数据集的情况下执行此操作。使用dplyr
,我们按'{1}}值将'timeofday','dayOfWeek'和replace
NA元素(which(is.na(measurement))
)分组为'measurement'。
mean
或者我们使用library(dplyr)
a <- activityData %>%
group_by(timeofday, dayOfWeek) %>%
mutate(Mean= mean(measurement, na.rm=TRUE),
measurement= replace(measurement,
which(is.na(measurement)), first(Mean))) %>%
select(-Mean)
,这将更直接
ifelse
或者我们在 a1 <- activityData %>%
group_by(timeofday, dayOfWeek) %>%
mutate(measurement= ifelse(is.na(measurement),
mean(measurement, na.rm=TRUE), as.numeric(measurement)))
来电中使用na.aggregate
中的library(zoo)
。
mutate
或使用library(zoo)
b <- activityData %>%
group_by(timeofday, dayOfWeek) %>%
mutate(measurement= na.aggregate(measurement))
identical(a$measurement, b$measurement)
#[1] TRUE
identical(a1$measurement, b$measurement)
#[1] TRUE
的类似选项。我们将'data.frame'转换为'data.table'(data.table
),按变量分组,我们将(setDT(activityData)
)度量指定为'measurement'的:=
。< / p>
na.aggregate
library(data.table)
setDT(activityData)[, measurement := na.aggregate(measurement) ,
by = .(timeofday, dayOfWeek)]