首页 > 解决方案 > 使用 nanor 的多个变量的 recode_shadow

问题描述

我刚从 R 开始,在尝试使用 naniar 库将 88 重新编码为特殊缺失值时遇到了这个问题。鉴于此数据框:

library(tidyverse)
df <- tibble::tribble(
  ~wind, ~temp, ~sun, ~test,
  88,    45,   88,     NA,
  68,    NA,   23,     63,
  NA,    88,   88,     15,
)

我想将阴影矩阵中的所有“88”更改为 NA_broken_machine。 所以我所做的是首先使用 bind_shadow 将阴影矩阵附加到我的数据,然后使用 recode_shadow 添加新的缺失级别,但即使新级别应用于所有阴影矩阵,它也只会改变风变量

library(naniar)
dfs_recode <- df %>%
  bind_shadow() %>% 
  recode_shadow(wind = .where(wind == 88 ~ "broken_machine")) 

dfs_recode
# A tibble: 3 x 8
   wind  temp   sun  test wind_NA           temp_NA sun_NA test_NA
  <dbl> <dbl> <dbl> <dbl> <fct>             <fct>   <fct>  <fct>  
1    88    45    88    NA NA_broken_machine !NA     !NA    NA     
2    68    NA    23    63 !NA               NA      !NA    !NA    
3    NA    88    88    15 NA                !NA     !NA    !NA    

str(dfs_recode)
tibble [3 x 8] (S3: nabular/tbl_df/tbl/data.frame)
 $ wind   : num [1:3] 88 68 NA
 $ temp   : num [1:3] 45 NA 88
 $ sun    : num [1:3] 88 23 88
 $ test   : num [1:3] NA 63 15
 $ wind_NA: Factor w/ 3 levels "!NA","NA","NA_broken_machine": 3 1 2
 $ temp_NA: Factor w/ 3 levels "!NA","NA","NA_broken_machine": 1 2 1
 $ sun_NA : Factor w/ 3 levels "!NA","NA","NA_broken_machine": 1 1 1
 $ test_NA: Factor w/ 3 levels "!NA","NA","NA_broken_machine": 2 1 1

我遇到的唯一一个是使用 mutate 逐个变量做变量,然后将其转换为阴影。我认为有更好的方法可以做到这一点,但我无法弄清楚。我非常感谢您对此的帮助。

x <- dfs_recode %>% 
   mutate(temp_NA = factor(case_when(temp == 88 ~ "NA_broken_machine",
                                    TRUE ~ as.character(temp_NA))))
x
# A tibble: 3 x 8
   wind  temp   sun  test wind_NA           temp_NA           sun_NA test_NA
  <dbl> <dbl> <dbl> <dbl> <fct>             <fct>             <fct>  <fct>  
1    88    45    88    NA NA_broken_machine !NA               !NA    NA     
2    68    NA    23    63 !NA               NA                !NA    !NA    
3    NA    88    88    15 NA                NA_broken_machine !NA    !NA    

are_shade(x)
   wind    temp     sun    test wind_NA temp_NA  sun_NA test_NA 
  FALSE   FALSE   FALSE   FALSE    TRUE   FALSE    TRUE    TRUE 

x$temp_NA <- shade(x$temp, broken_machine = 88) 

are_shade(x)
   wind    temp     sun    test wind_NA temp_NA  sun_NA test_NA 
  FALSE   FALSE   FALSE   FALSE    TRUE    TRUE    TRUE    TRUE 

标签: rmissing-datashadownaniar

解决方案


这可能是您正在寻找的吗?

dfs_recode <- df %>%
    bind_shadow() %>% 
    mutate_all(~ ifelse(.==88, "NA_broken_machine", .))

产生:

> dfs_recode
# A tibble: 3 x 8
  wind              temp              sun                test wind_NA temp_NA sun_NA test_NA
  <chr>             <chr>             <chr>             <dbl>   <int>   <int>  <int>   <int>
1 NA_broken_machine 45                NA_broken_machine    NA       1       1      1       2
2 68                NA                23                   63       1       2      1       1
3 NA                NA_broken_machine NA_broken_machine    15       2       1      1       1

%>% select(wind, temp, sun, test)您可以通过在末尾添加 a 来删除额外的列。


推荐阅读