用两列上的查找值替换NA

时间:2015-10-10 18:46:05

标签: r

我有一个数据框,其中包括日期,时间和几天内的测量值。

部分测量值为NA。我想用推算值替换它们。

为了解决这个问题,我创建了第二个数据帧来保存插补值:

meanMeasurementByTimeAndDayOfWeek <- 
  ddply(activityData, c('timeofday', 'dayOfWeek'), 
  summarize, avgMeasurement = mean(measurement, na.rm=TRUE))

(我认为这是对的。)

如何根据timeofday和dayOfWeek值将第二个数据框中的avgMeasurement值替换为activityData数据帧的测量列中的NA?

1 个答案:

答案 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)]