【问题标题】:Rename all levels of factor variable, is there a tidyverse way to do it?重命名因子变量的所有级别,有没有一种tidyverse方法呢?
【发布时间】:2020-06-11 12:49:29
【问题描述】:

我偶尔需要重命名因子变量的所有级别。我知道如何使用 R 基础来实现这一点,例如:levels(factor_variable) <- levels(new_variable)。但我真的很想有一种方法来使用tidyverse 来做这种事情。我查看了dplyrforcats,但我没有找到任何可以解决的问题。我希望能够做我在示例 1 中实现的目标,但使用 %>% 运算符。

示例 1,带有 R 基础(有效)

my_levels <- letters
sample_data <- data.frame(factor_data = factor(sample(my_levels,size = 500,replace = T) ,
                                               levels = my_levels),
                          Any_other_data = rnorm(500))

my_new_levels <- rnorm(length(letters))

levels(sample_data$factor_data) <- levels(factor(my_new_levels))

示例 2,我尝试过但不适用于 tidyverse 的一件事

library(tidyverse)

my_levels <- letters
sample_data <- tibble(factor_data = factor(sample(my_levels,size = 500,replace = T) ,
                                               levels = my_levels),
                          Any_other_data = rnorm(500))

my_new_levels <- rnorm(length(letters))

# Get error
sample_data <- sample_data %>%
  mutate(levels(factor_data) = levels(factor(my_new_levels)))
# Get error
sample_data <- sample_data %>%
  mutate(factor_data = recode(factor_data, levels(factor_data) = levels(factor(my_new_levels))))

我也尝试重新编码,但它不仅是手动的(一次每个值),而且它也不接受%&gt;%operator。这是我试图看看发生了什么的一些事情:

sample_data <- sample_data %>%
  recode(factor_data, a = '-2.5')

sample_data <- sample_data %>%
  recode_factor(factor_data, a = '-2.5')

recode(sample_data$factor_data, levels(sample_data$factor_data) = levels(factor(my_new_levels)))

recode(sample_data$factor_data, a = '-2.5')
recode_factor(sample_data$factor_data, a = '-2.5')

【问题讨论】:

  • 您展示的基本方法比必要的复杂。你真的只是想要levels(sample_data$factor_data) &lt;- my_new_levels。我不明白您为什么认为管道版本会对此有所改进。
  • 对我来说,它可以让我更轻松、更快速地编写代码并在一行中使用 ggplot 制作图表。我想知道是否有一种简单的方法可以使用管道版本。

标签: r dplyr tidyverse forcats


【解决方案1】:

您可以使用命名向量和forcats::fct_recode()轻松做到这一点:

library(tidyverse)
set.seed(42)

my_levels <- letters
sample_data <- data.frame(factor_data = factor(sample(my_levels,size = 500,replace = T) ,
                                               levels = my_levels),
                          Any_other_data = rnorm(500))

my_new_levels <- rnorm(length(letters))

# create a named vector with the new levels
named_level_vector <- levels(sample_data$factor_data)
names(named_level_vector) <- my_new_levels

# use mutate and fct_recode with that vector

sample_data <- sample_data %>% 
  mutate(new_factor_data = forcats::fct_recode(factor_data, !!!named_level_vector))

head(sample_data)
#>   factor_data Any_other_data    new_factor_data
#> 1           q     0.48236947  0.223521215874458
#> 2           e     0.99294364  -1.12828853519737
#> 3           a    -1.24639550  -2.55382485095083
#> 4           y    -0.03348752   1.67099730539817
#> 5           j    -0.07096218 -0.318990710826149
#> 6           d    -0.75892065  -1.17990419995829

reprex package (v0.3.0) 于 2020-06-11 创建

【讨论】:

    猜你喜欢
    • 2023-01-20
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2019-12-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多