如何将 fct_relabel 与 strsplit 或类似工具一起使用以重新标记因子列?

How do I use fct_relabel with strsplit or similar to relabel a factor column?

我正在尝试使用 tidyverse 代码自动更改因子列的标签,但我无法根据简单的函数更改标签。

一些示例数据如下所示:

   subjectid Parameter   value
   <chr>     <fct>       <dbl>
 1 13        alpha_IST  0.0751
 2 13        alpha_IEX 15.7   
 3 13        alpha_CB   0.236 
 4 15        alpha_IST  0.0680
 5 15        alpha_IEX 16.5   
 6 15        alpha_CB   0.282 
 7 17        alpha_IST  0.0793

(为了重现,下面列出了前 6 行的 dput 输出)

structure(
  list(
    subjectid = c("13", "13", "13", "15", "15", "15"),
    Parameter = structure(c(3L, 2L, 1L, 3L, 2L, 1L), .Label = c("alpha_CB", "alpha_IEX", "alpha_IST"), class = "factor"),
    value = c(0.0751, 15.7, 0.236, 0.0680, 16.5, 0.282)
  ),
  row.names = c(NA, -6L),
  class = c("tbl_df", "tbl", "data.frame")
)

我正在尝试删除多余的参数标签的前半部分(即删除 alpha_)。

鉴于上述对象称为中位数,我可以使用:

par_labels <- sapply(
  strsplit(levels(medians$Parameter), "_"),
  function(x) {
    x[2]
  }
)

medians %>% mutate(Parameter = factor(Parameter, labels = par_labels))

似乎我应该能够使用 fct_relabel 函数构建相同的功能,但是我似乎无法让它工作。

我试过:

medians %>%
  mutate(Parameter = fct_relabel(Parameter, function(x) {
    strsplit(x, "_")[2]
  }))

给出错误 Error: Problem with mutate() input Parameter. ✖ new_levels must be a character vector.

我也试过:

medians %>%
  mutate(Parameter = fct_relabel(Parameter, function(x) {
    strsplit(x, "_")[[1]][2]
  }))

其中有如下错误信息:Error: Problem with mutate() input Parameter. ✖ new_levels must be the same length as levels(f): expected 3 new levels, got 1.

我尝试过其他组合,但都没有成功,我可以看到转换为字符向量,使用 tidyr 分离然后转换回因子是可行的,但我觉得它应该是可能以类似于我尝试过的方式。这可能吗?

您可以将 fct_relabel 用作 :

library(dplyr)
library(forcats)

medians %>%
  mutate(Parameter = fct_relabel(Parameter, 
                       function(x) sapply(strsplit(x, "_"), `[`, 2)))

# subjectid Parameter   value
#  <chr>     <fct>       <dbl>
#1 13        IST        0.0751
#2 13        IEX       15.7   
#3 13        CB         0.236 
#4 15        IST        0.068 
#5 15        IEX       16.5   
#6 15        CB         0.282 

但是对于这个问题,这就是我在 base R 中使用的方法:

levels(medians$Parameter) <- sub('.*_', '', levels(medians$Parameter))

fct_relabel :

medians %>%
  mutate(Parameter = fct_relabel(Parameter, ~ sub('.*_', '', .x)))