【问题标题】:How to fill out missing value in column K using the value in column K-1 for the whole data frame如何使用整个数据框的 K-1 列中的值填写 K 列中的缺失值
【发布时间】:2018-11-28 18:30:48
【问题描述】:

嘿,我需要先填写数据框的缺失值,然后才能在闪亮的应用程序上运行它们。规则是使用整个数据框的 K-1 列中的值填写 K 列中的缺失值。

我实际上已经想出了如何做到这一点,但我认为我的方式太复杂了。我相信应该有更简单的方法来做到这一点。我在这里附上数据、代码和输出。如果您有更简单的方法,请告诉我。

非常感谢。

    data2 = data.frame('population by age' = seq(3, 24, by = 1), 
                   '2008' = c(145391,
                              140621,
                              136150,
                              131944,
                              127968,
                              124209,
                              120650,
                              117163,
                              113674,
                              110207,
                              106871,
                              103659,
                              100398,
                              97017,
                              93584,
                              90240,
                              86957,
                              83783,
                              80756,
                              77850,
                              75003,
                              72226
                   ),  
                   '2009' = c(148566,
                              143943,
                              139367,
                              135083,
                              131052,
                              NA,
                              123628,
                              120213,
                              116826,
                              113381,
                              109915,
                              106574,
                              103346,
                              100058,
                              96644,
                              93175,
                              NA,
                              86455,
                              NA,
                              80192,
                              77279,
                              74422
                   ), 
                   '2010' = c(152330,
                              147261,
                              142555,
                              138172,
                              134071,
                              130214,
                              126559,
                              123099,
                              119825,
                              116538,
                              113134,
                              109669,
                              106320,
                              103075,
                              99760,
                              96312,
                              92805,
                              NA,
                              NA,
                              82733,
                              79661,
                              76739
                   ),  
                   '2011' = c(156630,
                              151387,
                              146491,
                              141905,
                              137593,
                              133545,
                              129737,
                              126124,
                              122678,
                              NA,
                              116093,
                              112666,
                              109174,
                              105791,
                              102505,
                              99159,
                              95699,
                              92193,
                              88759,
                              85373,
                              82123,
                              79065
                   )) 


data7 <- data2 %>%
  gather(key = year, value = value, -`population.by.age` )%>%
  group_by(`population.by.age`) %>%
  nest
library(imputeTS)
impute_nas <- function(df, var, fun, ...) {

  df[[var]] <- fun(df[[var]], ...)

  return(df)
}
imputed <- data7 %>%
  mutate(
    interpolation = purrr::map(data, impute_nas, var = 'value', fun = imputeTS::na.locf)
    ) %>%
  select(-data) %>%
  unnest 

imputed <- imputed %>% spread(key = 'year', value = 'value')
as.data.frame(imputed)

最好的,

【问题讨论】:

  • 您在问如何估算 NA 值。使用这种方法,您将如何处理第一列中的NA 值?没有第零列?
  • 我同意第一列中没有第零列。但好在第一列中没有 NA。所以让我们从这里开始吧。
  • @Cathy 你想让它有级联效应吗?意思是22中的1列中的值将填充1列中的值,然后3列中的NA将填充2列中的值等等...请确认。跨度>
  • 是的。但是如果第 2 列和第 3 列都是 Na,则应该使用第 1 列中的值。

标签: r time shiny dplyr series


【解决方案1】:

一个选项是使用zoo::na.locf 的幂来用最后一个可用值填充NAapply 函数可以传递逐行数据,zoo::na.locf 将在这些数据上填充缺失值。

library(zoo)

cbind(data2[1], t(apply(data2[2:5], 1, zoo::na.locf)))

#    population.by.age  X2008  X2009  X2010  X2011
# 1                  3 145391 148566 152330 156630
# 2                  4 140621 143943 147261 151387
# 3                  5 136150 139367 142555 146491
# 4                  6 131944 135083 138172 141905
# 5                  7 127968 131052 134071 137593
# 6                  8 124209 124209 130214 133545
# 7                  9 120650 123628 126559 129737
# 8                 10 117163 120213 123099 126124
# 9                 11 113674 116826 119825 122678
# 10                12 110207 113381 116538 116538
# 11                13 106871 109915 113134 116093
# 12                14 103659 106574 109669 112666
# 13                15 100398 103346 106320 109174
# 14                16  97017 100058 103075 105791
# 15                17  93584  96644  99760 102505
# 16                18  90240  93175  96312  99159
# 17                19  86957  86957  92805  95699
# 18                20  83783  86455  86455  92193
# 19                21  80756  80756  80756  88759
# 20                22  77850  80192  82733  85373
# 21                23  75003  77279  79661  82123
# 22                24  72226  74422  76739  79065

【讨论】:

【解决方案2】:

我可以使用 for 循环提出的一个快速解决方案如下所示。当然,第一列不能推算。

impute_from_previous <- function(ds) {

  for (i in 2:length(colnames(ds))) {
    rows_missing <- which(is.na(ds[[i]]))
    ds[rows_missing, i] <- ds[rows_missing, i - 1]
  }
  return(ds)
}

data3 <- impute_from_previous(data2)

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多