【问题标题】:Replacing missing value with mean of 2 nearest rows in R用R中最近的2行的平均值替换缺失值
【发布时间】:2017-12-09 03:44:50
【问题描述】:

我有一个缺失值的数据表,我想用最近的 2 行的平均值替换它。

library(data.table)
A <- data.table(id = c(1:10),
                Value = c(1:3,NA,5:10))

> A
    id Value
 1:  1     1
 2:  2     2
 3:  3     3
 4:  4    NA
 5:  5     5
 6:  6     6
 7:  7     7
 8:  8     8
 9:  9     9
10: 10    10

例如,我希望将 NA 替换为 row3 和 row5 的平均值,即 4。

【问题讨论】:

  • 如果连续有两个 NA 怎么办?如果最后一行有 NA 怎么办?你可能想多解释一下你的情况。

标签: r dataframe datatable


【解决方案1】:
Zoo 包中的

na.approx 就是这样做的。如果可能有前导或尾随 NA 值并且您想要:

  • 扩展最近的非 NA 值,将 rule = 2 参数添加到 na.approx 或
  • 将这些保留为 NA,将 na.rm = FALSE 参数添加到 na.approx。

更多参数请参见?na.approx。来自同一包的其他可能性包括na.spline(用三次样条拟合填充)、na.aggregate(所有非 NA 值的平均值)、na.locf(最后一个值结转)和na.StructTS(季节性卡尔曼滤波器) .

library(zoo)

A[, list(Value = na.approx(Value))]

给予:

    Value
 1:     1
 2:     2
 3:     3
 4:     4
 5:     5
 6:     6
 7:     7
 8:     8
 9:     9
10:    10

【讨论】:

    【解决方案2】:

    我已经制作了一个函数,可以在您的数据表中使用多个连续的 NA。

    library(data.table)
    A <- data.table(id = c(1:11),
                Value = c(1,5:6,NA,10:12,NA,NA,NA,6))
    
    
    
    library(dplyr)
    # Finding the maximum length of a stretch of contiguous NA's in the column
    a<- max(diff(which(!is.na(A$Value)))-1)
    
    # Repeating the for loop "a" times and breaking when all NA's have been filled
    repeat{
    for(i in 1:a){
    A$Value[which(A$Value%in%NA)] <- ((lag(A$Value, 1)+lead(A$Value, i))/2)[which(A$Value%in%NA)]
    }
    if(any(is.na(A$Value)) ==FALSE) { break }
    }
    

    对于向量中的每个 NA,for 循环内的函数计算 NA 之前的值和下一个可用值的平均值。

    这绝对不是最优雅或最有效的解决方案,因为有很多重复,但我相信它以您想要的方式与多个 NA 一起工作。

    【讨论】:

    • lead() 函数从何而来?我找不到它。
    • lead() 和 lag() 函数都来自 dplyr 包。
    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 2012-05-03
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多