用dplyr

时间:2018-10-10 21:45:42

标签: r dplyr r-mice

我目前正在R中的tidyverse上工作。在使用鼠标推算NA后,由于某些列开始时填充不足(我相信),因此某些列仍具有NA。作为最后的检查,我想将所有剩余的NA替换为-1。通常,它仅取决于数据集而在单个列中发生。长话短说,我在多个位置都执行相同的过程,有时Col1在A区的填充很好,但在B区的填充不好。

当前我正在执行以下操作。

    Clean.df <- df %>% mutate(
              coalesce(Col1 ,-1),
              coalesce(Col2, -1),
              ....)

我对31列进行了此操作,这使我认为必须有一种更简单的方法。我试图阅读合并文档,并尝试将其替换为数据框的名称,但不走运。

感谢您的见解。

2 个答案:

答案 0 :(得分:3)

由于您未提供任何数据,因此我使用示例数据框来说明如何用给定值(class Writer { const size_t MAX_BOOKS_WRITTEN = 5U; Book books_written[MAX_BOOKS_WRITTEN]; }; )替换数据框中的每个NA

-1

reprex package(v0.2.1)于2018-10-10创建

答案 1 :(得分:0)

替代Indrajeet的答案是纯dplyr。使用Indrajeet的ggplot2::msleep推荐:

library(dplyr)
ggplot2::msleep %>%
  mutate_at(vars(sleep_rem, sleep_cycle), ~ if_else(is.na(.), -1, .))
# # A tibble: 83 x 11
#    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
#    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
#  1 Chee~ Acin~ carni Carn~ lc                  12.1      -1        -1      11.9
#  2 Owl ~ Aotus omni  Prim~ <NA>                17         1.8      -1       7  
#  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      -1       9.6
#  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
#  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
#  6 Thre~ Brad~ herbi Pilo~ <NA>                14.4       2.2       0.767   9.6
#  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
#  8 Vesp~ Calo~ <NA>  Rode~ <NA>                 7        -1        -1      17  
#  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
# 10 Roe ~ Capr~ herbi Arti~ lc                   3        -1        -1      21  
# # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

如果要在所有列(numericcharacter)上使用核选项,请使用:

ggplot2::msleep %>%
  mutate_all(~ ifelse(is.na(.), -1, .))
# # A tibble: 83 x 11
#    name  genus vore  order conservation sleep_total sleep_rem sleep_cycle awake
#    <chr> <chr> <chr> <chr> <chr>              <dbl>     <dbl>       <dbl> <dbl>
#  1 Chee~ Acin~ carni Carn~ lc                  12.1      -1        -1      11.9
#  2 Owl ~ Aotus omni  Prim~ -1                  17         1.8      -1       7  
#  3 Moun~ Aplo~ herbi Rode~ nt                  14.4       2.4      -1       9.6
#  4 Grea~ Blar~ omni  Sori~ lc                  14.9       2.3       0.133   9.1
#  5 Cow   Bos   herbi Arti~ domesticated         4         0.7       0.667  20  
#  6 Thre~ Brad~ herbi Pilo~ -1                  14.4       2.2       0.767   9.6
#  7 Nort~ Call~ carni Carn~ vu                   8.7       1.4       0.383  15.3
#  8 Vesp~ Calo~ -1    Rode~ -1                   7        -1        -1      17  
#  9 Dog   Canis carni Carn~ domesticated        10.1       2.9       0.333  13.9
# 10 Roe ~ Capr~ herbi Arti~ lc                   3        -1        -1      21  
# # ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

请注意,我不再使用dplyr::if_else,因为该功能需要对不同类型(或不知道这些类型)具有通用性。由于base::ifelse会很乐意/无声地(/ sloppily?)转换,所以我们很好。