【问题标题】:Releveling a factor with a variable that points to the levels variable使用指向级别变量的变量重新调整因子
【发布时间】:2021-08-26 18:12:31
【问题描述】:

我想使用一个变量重新调整 R 中的一个因子,该变量指向具有要重新调整的变量向量的变量。

library(tidyverse)
response = fct_relevel(response, <variable containing name of vector variable>)

我这样做是因为我有一个查找表,我可以在其中提取包含我想用来重新调整因子的向量的变量的名称。例如,这是question_group 的查找表,每个question_group 都有自己的向量来重新调整。

# a lookup table where I can get the level for each question group
levels_lkup <- tibble(question_group = c("A", "B", "C"),
                         factor_level = c("level_1", "level_2", "level_3"))

例如,这里是三个因子向量。

# define factor levels
level_1 <- c("Excellent", "Fair", "Poor")
level_2 <- c("Positive", "Neutral", "Negative")
level_3 <- c("Happy", "Indifferent", "Sad")

在这个reprex 中,我想使用level_1 优秀/一般/差。 我正在为问题组 A 存储 factor_level。

# pull the level for question group A. (The problem is that this pulls "level_1" in quotes)
this_level <- levels_lkup %>% 
  filter(question_group == "A") %>% 
  pull(factor_level)

问题是当我在fct_relevel 中使用this_level 时,它不会评估,因为它是评估this_level 作为字符"level_1" 而不是对上面定义的向量level_1 的引用。

# my data of id numbers, q_a1, and q_a2
df_foo <- tibble(id = c(1:6),
                 q_a1 = c(rep("Excellent", 3), rep("Poor",3)),
                 q_a2 = c(rep("Fair", 3), rep("Poor",2), NA)) %>% 
  # notice that there are unknown levels, because each variable does not have at least one of each factor level
  # meaning, once I pivot_longer, the new variable will need to be relevelled.
  mutate(q_a1 = fct_relevel(q_a1, level_1),
         q_a2 = fct_relevel(q_a2, level_1)) %>% 
  pivot_longer(-id, names_to = "key", values_to = "response") %>% 
  # I can't use "this_level" as a pointer to level_1. This does not relevel the factor.
  mutate(response = fct_relevel(response, this_level))

我可以使用这个指针重新调整因子吗?

【问题讨论】:

    标签: r factors forcats


    【解决方案1】:

    我不太明白您要达到的目标。如果您希望 response 成为 level_1 级别的一个因素,那么只需执行以下操作:

    df_foo <- tibble(id = c(1:6),
                     q_a1 = c(rep("Excellent", 3), rep("Poor",3)),
                     q_a2 = c(rep("Fair", 3), rep("Poor",2), NA)) %>% 
      mutate(q_a1 = q_a1 %>% factor(level_1),
             q_a2 = q_a2 %>% factor(level_1)) %>% 
      pivot_longer(-id, names_to = "key", values_to = "response")
    
    df_foo$response
    
    [1] Excellent Fair      Excellent Fair      Excellent Fair      Poor      Poor      Poor      Poor      Poor      <NA>     
    Levels: Excellent Fair Poor
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      相关资源
      最近更新 更多