如何将 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)))
我正在尝试使用 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)))