【问题标题】:Average previous and next row for missing value缺失值的平均上一行和下一行
【发布时间】:2014-10-28 23:52:25
【问题描述】:

我对 R 比较陌生,遇到了一些问题。我正在使用在某些年份缺少值的数据框。例如:

year var1 var2
1972 1.3  1.4
1973 1.6  2.8
1974 2.0  1.5
1975 NA   NA
1976 1.5  2.1
1977 NA   NA
1978 1.9  1.1

对于每个 NA,我想取上一行和下一行的平均值。所以 1975 年的 var1 和 var2 应该分别是 1.75 和 1.8。在 1977 年,它们应该是 1.7 和 1.6。有什么想法吗?

【问题讨论】:

    标签: r mean missing-data


    【解决方案1】:

    你可以在包zoo中使用na.approx

    library(zoo)
    df$var1 <- na.approx(df$var1)
    df$var2 <- na.approx(df$var2)
    ##
    > df
      year var1 var2
    1 1972 1.30  1.4
    2 1973 1.60  2.8
    3 1974 2.00  1.5
    4 1975 1.75  1.8
    5 1976 1.50  2.1
    6 1977 1.70  1.6
    7 1978 1.90  1.1
    
    • 正如@Jilber 指出的那样,这可以更简洁地完成

      df <- sapply(df, na.approx)
      
    • 根据@Richard Scriven 的评论,您可能希望保留 data.frame 类与

      df[-1] <- lapply(df[-1], na.approx)
      

      df[-1] <- vapply(df[-1], na.approx, numeric(nrow(df))) 
      

    数据:

    df <- read.table(
      text="year var1 var2
    1972 1.3  1.4
    1973 1.6  2.8
    1974 2.0  1.5
    1975 NA   NA
    1976 1.5  2.1
    1977 NA   NA
    1978 1.9  1.1",
      header=TRUE)
    

    【讨论】:

    • 今晚带回家的另一个功能。谢谢你。 +1
    • 你可以使用sapply来缩短你的代码:sapply(df, na.approx)
    • df[-1] &lt;- lapply(df[-1], na.approx) 将其保存在数据框中。 sapply 返回一个矩阵
    • 或者可能比 lapply 更快的是 df[-1] &lt;- vapply(df[-1], na.approx, numeric(nrow(df))),好吧,我完成了 (+1)
    • as.data.frame(na.approx(DF)) 另外,您可能希望将数据框转换为更方便处理时间序列的动物园对象:library(zoo); z &lt;- read.zoo(DF, FUN = identity); na.approx(z)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2021-10-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多