【问题标题】:Converting multiple columns to factors and releveling with mutate(across) in R将多列转换为因子并在 R 中使用 mutate(across) 重新调整
【发布时间】:2022-08-23 11:05:27
【问题描述】:
dat <- data.frame(Comp1Letter = c(\"A\", \"B\", \"D\", \"F\", \"U\", \"A*\", \"B\", \"C\"),
                   Comp2Letter = c(\"B\", \"C\", \"E\", \"U\", \"A\", \"C\", \"A*\", \"E\"),
                   Comp3Letter = c(\"D\", \"A\", \"C\", \"D\", \"F\", \"D\", \"C\", \"A\"))  

GradeLevels <- c(\"A*\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"U\")

我有一个类似于上面的数据框(但我不想更改许多其他列)。

我有兴趣更改的列包含字母等级列表,但当前是字符向量且顺序不正确。

我需要将这些列中的每一列转换为具有正确顺序的因子。我已经能够使用下面的代码让它工作:

factordat <-
    dat %>%
      mutate(Comp1Letter = factor(Comp1Letter, levels = GradeLevels)) %>%
      mutate(Comp2Letter = factor(Comp2Letter, levels = GradeLevels)) %>%
      mutate(Comp3Letter = factor(Comp3Letter, levels = GradeLevels)) 

然而,这非常冗长并且占用了大量空间。

看看其他一些问题,我尝试使用 mutate() 和 cross() 的组合,如下所示:

factordat <-
  dat %>%
    mutate(across(c(Comp1Letter, Comp2Letter, Comp3Letter) , factor(levels = GradeLetters))) 

但是,当我这样做时,向量仍然是字符向量。

有人可以告诉我我做错了什么或提供另一种选择吗?

    标签: r


    【解决方案1】:

    您可以将across 作为匿名函数执行,如下所示:

    dat %>%
      mutate(across(starts_with("Comp"), ~factor(., levels = GradeLevels)))
    
      Comp1Letter Comp2Letter Comp3Letter
    1           A           B           D
    2           B           C           A
    3           D           E           C
    4           F           U           D
    5           U           A           F
    6          A*           C           D
    7           B          A*           C
    8           C           E           A
    

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 2022-01-01
      • 2021-03-01
      • 2021-11-11
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      相关资源
      最近更新 更多