r - 用包括 NA 在内的许多值重新编码数值变量
问题描述
如何重新编码具有许多值(包括缺失值)的数字变量,以整齐的方式获得0:n-1
唯一n
值的数量(包括 )的数字?NA
例子:
df <- tibble(x = c(1000, 1000, NA, 1001, 1002, 1003, NA, 1003))
所需的输出(尽管它可以是任何重新编码方案,只要值为0:n-1
):
# A tibble: 8 x 2
x y
<dbl> <dbl>
1 1000 0
2 1000 0
3 NA 4
4 1001 1
5 1002 2
6 1003 3
7 NA 4
8 1003 3
我可以通过首先转换为一个因子然后使用命名列表(自动创建,因为记住其中有很多值),然后返回数字来以一种整洁的方式做到这一点:x
fct_recode()
x
df <- df %>% mutate(x_fct = factor(case_when(
is.na(x) ~ "level_na",
TRUE ~ str_c("level_", x)
)))
x_levels <- levels(df$x_fct)
n_levels <- length(x_levels)
names(x_levels) <- as.character(0:(n_levels - 1))
df <- df %>%
mutate(y = as.numeric(fct_recode(x_fct, !!!x_levels)) - 1)
df
# A tibble: 8 x 3
x x_fct y
<dbl> <fct> <dbl>
1 1000 level_1000 0
2 1000 level_1000 0
3 NA level_na 4
4 1001 level_1001 1
5 1002 level_1002 2
6 1003 level_1003 3
7 NA level_na 4
8 1003 level_1003 3
但这似乎很麻烦。当然有更简单的方法,最好是在一个管道中。
解决方案
一种方法是使用match
+ unique
。您可以添加sample
以添加随机性
library(dplyr)
df %>%
mutate(level = paste('level', x, sep = '_'),
y = match(x, sample(unique(x))) - 1)
# x level y
# <dbl> <chr> <dbl>
#1 1000 level_1000 4
#2 1000 level_1000 4
#3 NA level_NA 2
#4 1001 level_1001 0
#5 1002 level_1002 1
#6 1003 level_1003 3
#7 NA level_NA 2
#8 1003 level_1003 3
推荐阅读
- excel - 查找单元格上方的单元格的值
- reactjs - React js中Material-ui Pickers的日期格式没有改变
- php - 在 laravel 中无法检查包含点的 GET 参数
- laravel - 在刀片组件中获取 Alpine JS 值?
- c# - 带有密码的 RSA 密钥对(AES-128-CBC 或 AES-256-CBC)
- java - 在firestore中获取查询结果的任何其他方法?
- excel - 尝试从 A 到 Z 对 Listbox 中加载的列进行排序
- graphql - 当返回类型是数组时,如何将父数据的父数据传递给子解析器?
- python - 如何将 for 循环与条件相结合?
- ansible - ansible playbook 卡在特定类型的主机上