首页 > 解决方案 > 用包括 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

我可以通过首先转换为一个因子然后使用命名列表(自动创建,因为记住其中有很多值),然后返回数字来以一种整洁的方式做到这一点xfct_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

但这似乎很麻烦。当然有更简单的方法,最好是在一个管道中。

标签: rdplyrrecodeforcats

解决方案


一种方法是使用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

推荐阅读