r - 使用 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
解决方案
这可能是您正在寻找的吗?
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 来删除额外的列。
推荐阅读
- php - 数据未使用 Laravel 保存在数据库中
- c# - 对象设置为活动但提醒未活动
- java - Java中的自定义动态时钟
- c# - Admob 插页式广告未在 Xamarin Forms Android 中显示
- rest - 禁用的 REST API 功能的 HTTP 状态代码是什么?
- ios - DownSample 与 CGImageSourceCreateThumbnailAtIndex 使内存急剧上升
- android - FileProvider 访问 Room 数据库抛出 IllegalArgumentException
- encryption - 如何在 ROKU 中添加用于加密和解密的公钥和私钥
- c# - 电子邮件地址域是否始终是 Microsoft Graph 中的租户域?
- docker - 如何在 docker 容器中挂载 EFS?