首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按模式重新排序因数级别

按模式重新排序因数级别
EN

Stack Overflow用户
提问于 2021-04-09 08:16:39
回答 4查看 108关注 0票数 2

我有一个因子,它可以识别测量数据集中的地层。我想重新排序因子,以便某些字符模式优先于其他字符模式。

例如,我有一个表示性别、年龄和教育程度的混合因子:

代码语言:javascript
复制
my_factor <- factor(levels=c(1:8),
                    labels=c("Male-18_34-HS","Female-35_49-HS",
                             "Male-18_34-CG", "Female-18_34-CG",
                             "Male-35_49-HS", "Male-35_49-CG",
                             "Female-18_34-HS", "Female-35_49-CG"),
                    ordered=TRUE)

我希望这是排序与所有女性类别首先,然后在正确的顺序年龄类别,然后在正确的顺序教育类别。我可以使用forcats::fct_relevel完成大部分工作。

代码语言:javascript
复制
forcats::fct_relevel(my_factor, sort)

ordered(0)
8 Levels: Female-18_34-CG < Female-18_34-HS < Female-35_49-CG < Female-35_49-HS < Male-18_34-CG < Male-18_34-HS < ... < Male-35_49-HS

但教育类别的顺序是错误的。有没有办法确保"HS“在"CG”之前,但性别和年龄组的顺序相同?

EN

回答 4

Stack Overflow用户

发布于 2021-04-09 09:01:09

您可以创建一个参照表,按列系数级别排列:

代码语言:javascript
复制
library(dplyr)
library(tidyr)

ref <- tibble(key = c("Male-18_34-HS","Female-35_49-HS",
                      "Male-18_34-CG", "Female-18_34-CG",
                      "Male-35_49-HS", "Male-35_49-CG",
                      "Female-18_34-HS", "Female-35_49-CG"))

ref <- separate(ref, key, into = c("gender", "age", "education"), sep = "-", remove = FALSE) %>%
  mutate(across("gender", factor, c("Female", "Male")),
         across("age", factor, c("18_34", "35_49")),
         across("education", factor, c("HS", "CG"))) %>%
  arrange(gender, age, education)

然后申请:

factor(d, levels = ref$key)

票数 2
EN

Stack Overflow用户

发布于 2021-04-09 10:50:25

您可以通过编程方式创建所需的因子级别。

代码语言:javascript
复制
lvls <- do.call(paste, c(tidyr::expand_grid(
           c('Female', 'Male'), c('18_34', '35_49'), c('HS', 'CG')), sep = '-'))
lvls
#[1] "Female-18_34-HS" "Female-18_34-CG" "Female-35_49-HS" "Female-35_49-CG"
#[5] "Male-18_34-HS"   "Male-18_34-CG"   "Male-35_49-HS"   "Male-35_49-CG"

您可以在factor调用中将此lvls用作级别。

票数 2
EN

Stack Overflow用户

发布于 2021-04-09 13:07:05

您可以使用str_split拆分标签,对生成的列表进行排序,并相应地重建级别:

代码语言:javascript
复制
lvl <- do.call(rbind,stringr::str_split(levels(my_factor),'-'))
lvl <- apply(lvl[order(lvl[,1],lvl[,2],lvl[,3]),],1,paste0,collapse='-')
my_factor <- factor(my_factor,levels = lvl)

levels(my_factor)
#> [1] "Female-18_34-CG" "Female-18_34-HS" "Female-35_49-CG" "Female-35_49-HS"
#> [5] "Male-18_34-CG"   "Male-18_34-HS"   "Male-35_49-CG"   "Male-35_49-HS"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67013442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档