【问题标题】:Completing the NAs of a Tibble in R在 R 中完成 Tibble 的 NA
【发布时间】:2021-10-17 23:28:23
【问题描述】:

我在 R 中有一个数据库,其中变量中有一些 NA。我想应用一个逻辑函数,其中 NA 将用前一个值填充。下面是一个例子:

dados <- tibble::tibble(x = c(2, 3, 5, NA, 2, 1, NA, NA, 9, 3), 
                        y = c(4, 1, 9, NA, 8, 5, NA, NA, 1, 2)
)

# A tibble: 10 x 2
       x     y
   <dbl> <dbl>
 1     2     4
 2     3     1
 3     5     9
 4    NA    NA
 5     2     8
 6     1     5
 7    NA    NA
 8    NA    NA
 9     9     1
10     3     2

在这种情况下,变量 x 的第 4 个值将用 5 填充,依此类推。

谢谢!

【问题讨论】:

    标签: r dataframe na


    【解决方案1】:

    我们可以使用coalesce

    library(dplyr)
    dados %>% 
        mutate(across(x:y, ~ coalesce(., lag(.))))
    # A tibble: 10 x 2
           x     y
       <dbl> <dbl>
     1     2     4
     2     3     1
     3     5     9
     4     5     9
     5     2     8
     6     1     5
     7     1     5
     8    NA    NA
     9     9     1
    10     3     2
    

    【讨论】:

      【解决方案2】:

      我们可以使用来自tidyr 包的fill

      ibrary(tidyr)
      library(dplyr)
      
      dados %>% 
          fill(c(x,y), .direction = "down")
      
             x     y
         <dbl> <dbl>
       1     2     4
       2     3     1
       3     5     9
       4     5     9
       5     2     8
       6     1     5
       7     1     5
       8     1     5
       9     9     1
      10     3     2
      

      【讨论】:

      • 绝对是去这里的路!
      • 显然比我自己的答案更好,+1
      【解决方案3】:

      只有在列中的第一个值不是NA 时,以下操作才有效,但为了代码清晰和简单,我将其保留为执行,我们可以为一列解决此问题,如下所示:

      library(tibble)
      dados <- tibble::tibble(x = c(2, 3, 5, NA, 2, 1, NA, NA, 9, 3), 
                              y = c(4, 1, 9, NA, 8, 5, NA, NA, 1, 2)
      )
      
      #where are the NA?
      pos <- dados$x |>
               is.na() |>
               which()
      
      # replace 
      while(any(is.na(dados$x)))
        dados$x[pos] <- dados$x[pos-1]
      dados
      

      【讨论】:

        【解决方案4】:
        library(dplyr)
        
        dados %>%
          mutate(x = case_when(is.na(x) ~ lag(x),
                               TRUE ~ x),
                 y = case_when(is.na(y) ~ lag(y),
                               TRUE ~ y))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-08
          • 1970-01-01
          • 1970-01-01
          • 2021-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多