【问题标题】:Replace missing datapoints with the average of 2 other distant observations when there are multiple missing observations当存在多个缺失观测值时,将缺失的数据点替换为 2 个其他远距离观测值的平均值
【发布时间】:2023-02-06 10:00:52
【问题描述】:

我有一个每小时净动物运动的数据集,但有几次观察员定期缺席。我希望用缺失数据点前后 24 小时的同一时间段的平均值替换缺失的数据点(在新列中)。

示例数据:

#Data Creation
Day1<- rep(1,24)
Day2<- rep(2,24)
Day3<- rep(3,24)
Day<- c(Day1,Day2,Day3)
Hour<- rep(0:23,3)
Net <- round(rnorm(length(Day),mean = 2))
Dat<- data.frame(Day= Day,Hour= Hour,Net= Net)

#Populate missing observations
Dat[27,3]<- NA
Dat[31,3]<- NA
Dat

我最初应用了一个函数(如下),该函数将定位单个缺失值,然后索引缺失的数据点以定位缺失点前后 24 小时的行并取其平均值。

Dat$new.net<- sapply(Dat[,3],function(x)  
   if_else(is.na(x), mean(c(Dat[which(is.na(Dat),arr.ind = T)[1]-24,3],Dat[which(is.na(Dat),arr.ind = T)[1]+24,3])),x)) 

我找不到一种方法来使我用于 1 个缺失值的函数适用于多个缺失值,从而为每个缺失值生成唯一的平均值。目前,由于“Dat[which(is.na(Dat),arr.ind = T)[1]”,代码仅使用第一个缺失值的平均值

我如何更改我的代码以处理多个缺失值,或者是否有更优雅的解决方案?

附言。我知道如果前 23 小时或最后 23 小时内有缺失值,我会遇到问题。当我到达那里时,我会穿过那座桥。

任何帮助将不胜感激!

【问题讨论】:

    标签: r na


    【解决方案1】:

    我们可以得到 NA 值的索引,然后减去 24,加 24,每个元素,在 cbinding 之后得到 rowMeans 并将其分配给缺失的索引

    ind <- which(is.na(Dat[[3]]))
    Dat[[3]][ind] <- rowMeans(cbind(Dat[[3]][ind - 24], Dat[[3]][ind + 24]),
         na.rm = TRUE)
    

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2018-02-05
      • 1970-01-01
      • 2012-05-03
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多