如何从dydyverse中的向量重新编码因子水平?

问题描述 投票:0回答:1

考虑下面的数据集,有一个因子No具有34个级别,我想根据newLvl重新编码这些级别

MWE

structure(list(No = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 
11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 14L, 14L, 14L, 14L, 
15L, 15L, 15L, 15L, 15L, 15L, 16L, 16L, 16L, 16L, 16L, 16L, 17L, 
17L, 17L, 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 19L, 19L, 
19L, 19L, 19L, 19L, 20L, 20L, 20L, 20L, 20L, 20L, 21L, 21L, 21L, 
21L, 21L, 21L, 22L, 22L, 22L, 22L, 22L, 22L, 23L, 23L, 23L, 23L, 
23L, 23L, 24L, 24L, 24L, 24L, 24L, 24L, 25L, 25L, 25L, 25L, 25L, 
25L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 27L, 27L, 27L, 27L, 
27L, 27L, 28L, 28L, 28L, 28L, 29L, 29L, 29L, 29L, 29L, 29L, 30L, 
30L, 30L, 30L, 30L, 30L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 31L, 
32L, 32L, 32L, 32L, 32L, 32L, 33L, 33L, 33L, 33L, 33L, 33L, 34L, 
34L, 34L, 34L, 34L, 34L), .Label = c("1", "2", "3", "4", "5", 
"6", "7", "8", "10", "13", "14", "15", "16", "18", "19", "21", 
"22", "23", "24", "25", "27", "28", "29", "30", "31", "34", "38", 
"39", "40", "42", "47", "48", "49", "53"), class = "factor"), 
    Gender = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Female", 
    "Male"), class = "factor"), Age = c(23, 23, 23, 23, 23, 23, 
    39, 39, 39, 39, 39, 39, 30, 30, 30, 30, 30, 30, 30, 30, 24, 
    24, 24, 24, 24, 24, 24, 24, 18, 18, 18, 18, 18, 18, 23, 23, 
    23, 23, 23, 23, 23, 23, 26, 26, 26, 26, 26, 26, 23, 23, 23, 
    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 30, 30, 30, 30, 
    30, 30, 20, 20, 20, 20, 20, 20, 25, 25, 25, 25, 25, 25, 25, 
    25, 23, 23, 23, 23, 23, 23, 23, 23, 38, 38, 38, 38, 38, 38, 
    22, 22, 22, 22, 22, 22, 29, 29, 29, 29, 29, 29, 21, 21, 21, 
    21, 21, 21, 23, 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 
    24, 24, 24, 24, 24, 24, 21, 21, 21, 21, 21, 21, 27, 27, 27, 
    27, 27, 27, 24, 24, 24, 24, 24, 24, 21, 21, 21, 21, 21, 21, 
    21, 21, 21, 21, 21, 21, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
    23, 23, 23, 23, 23, 21, 21, 21, 21, 27, 27, 27, 27, 27, 27, 
    34, 34, 34, 34, 34, 34, 26, 26, 26, 26, 26, 26, 26, 26, 28, 
    28, 28, 28, 28, 28, 39, 39, 39, 39, 39, 39, 26, 26, 26, 26, 
    26, 26)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-218L))

向量

oldLvl <- c(23, 24, 48, 47, 3, 15, 49, 16, 21, 42, 39, 29, 28, 8, 38, 7, 53, 2, 19, 10, 5, 22, 6, 18, 14, 31, 27, 34, 25, 13, 40, 30, 4, 1)
newLvl <- c(1:34)

审判1

dplyr::mutate(Nbr  =  forcats::fct_recode(Nbr, 23 = "1", 24 = "2", 48 = "3", 47 = "4", 3 = "5", 15 = "6", 49 = "7", 16 = "8", 21 = "9", 42 = "10", 39 = "11", 29 = "12", 28 = "13", 8 = "14", 38 = "15", 7 = "16", 2 = "17", 53 = "18", 19 = "19", 10 = "20", 5 = "21", 22 = "22", 6 = "23", 18 = "24", 14 = "25", 31 = "26", 27 = "27", 34 = "28", 25 = "29", 13 = "30", 40 = "31", 30 = "32", 4 = "33", 1 = "34"))

审判2

  dplyr::mutate(Nbr  =  forcats::fct_recode(Nbr, "23" = "1", "24" = "2", "48" = "3", "47" = "4", "3" = "5", "15" = "6", "49" = "7", "16" = "8", "21" = "9", "42" = "10", "39" = "11", "29" = "12", "28" = "13", "8" = "14", "38" = "15", "7" = "16", "2" = "17", "53" = "18", "19" = "19", "10" = "20", "5" = "21", "22" = "22", "6" = "23", "18" = "24", "14" = "25", "31" = "26", "27" = "27", "34" = "28", "25" = "29", "13" = "30", "40" = "31", "30" = "32", "4" = "33", "1" = "34"))

问题

上述两项试验均无效。如何使用fct_*系列使用新的级别将旧级别重新编码为一个新变量,例如Nbr

r tidyverse levels recode
1个回答
0
投票

我们可以在创建命名为!!!vector后使用list

library(dplyr)
df1 %>%
     mutate(No = forcats::fct_recode(No, !!! setNames(as.character(newLvl), oldLvl)))
# A tibble: 218 x 3
#   No    Gender   Age
#   <fct> <fct>  <dbl>
# 1 23    Male      23
# 2 23    Male      23
# 3 23    Male      23
# 4 23    Male      23
# 5 23    Male      23
# 6 23    Male      23
# 7 24    Male      39
# 8 24    Male      39
# 9 24    Male      39
#10 24    Male      39
# … with 208 more rows
© www.soinside.com 2019 - 2024. All rights reserved.