【问题标题】:Using function na_ma in a numeric dataframe in R在 R 的数字数据框中使用函数 na_ma
【发布时间】:2021-11-21 21:21:38
【问题描述】:

我正在尝试使用来自library(imputeTS) 的函数na_ma;因为我正在处理数据框中的缺失值,方法是用周围值的平均值替换它们。

数据示例:

i1<-c(5,4,3,4,5)
i2<-c(2,NA,4,5,3)
i3<-c(NA,4,4,4,5)
i4<-c(3,5,5,NA,2)
data<-as.data.frame(cbind(i1,i2,i3,i4))
data

我的代码

data %>%
    rowwise %>%
        na_ma(as.numeric(x), k = 1, weighting = "simple")

预期结果:

i1 i2 i3 i4
1  5  2 2.5  3
2  4  4  4  5
3  3  4  4  5
4  4  5  4 4.5
5  5  3  5  2

问题,我不知道如何将na_ma(as.numeric(x), k = 1, weighting = "simple") 应用到这个数据框的每一行。

谢谢!

【问题讨论】:

    标签: r dataframe imputets


    【解决方案1】:

    如果您想使用tidyverse 来执行此操作,您可以使用pmap_df

    library(dplyr)
    library(purrr)
    
    data %>%
      pmap_df(~imputeTS::na_ma(c(...), k = 1, weighting = "simple"))
    
    #     i1    i2    i3    i4
    #  <dbl> <dbl> <dbl> <dbl>
    #1     5     2   2.5   3  
    #2     4     4   4     5  
    #3     3     4   4     5  
    #4     4     5   4     4.5
    #5     5     3   5     2  
    

    这也可以在基础 R 中完成 -

    data[] <- t(apply(data, 1, imputeTS::na_ma, k = 1, weighting = "simple"))
    

    【讨论】:

    • 非常感谢您将代码包含在基础 R 中!两者都很完美!
    【解决方案2】:

    您确定要这样做吗?通常我们用列的平均值估算

    cm <- colMeans(dat, na.rm=TRUE)
    dat <- Map(\(x, y) ifelse(is.na(x), y, x), data, cm) |>
      as.data.frame()
    dat
    #   i1  i2   i3   i4
    # 1  5 2.0 4.25 3.00
    # 2  4 3.5 4.00 5.00
    # 3  3 4.0 4.00 5.00
    # 4  4 5.0 4.00 3.75
    # 5  5 3.0 5.00 2.00
    

    实际上,最好使用更复杂的插补技术,例如多重插补。 Here a reading.


    数据

    dat <- structure(list(i1 = c(5, 4, 3, 4, 5), i2 = c(2, NA, 4, 5, 3), 
        i3 = c(NA, 4, 4, 4, 5), i4 = c(3, 5, 5, NA, 2)), class = "data.frame", row.names = c(NA, 
    -5L))
    

    【讨论】:

    • 感谢您的阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2014-04-21
    • 1970-01-01
    • 2017-02-07
    • 2022-12-09
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多