首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将一个范畴变量折叠成R中的较少元素

如何将一个范畴变量折叠成R中的较少元素
EN

Stack Overflow用户
提问于 2017-08-31 15:07:14
回答 3查看 1.9K关注 0票数 2

假设我有一个分类变量,如:

代码语言:javascript
复制
set.seed(123)
x<-sample(c("I", "IA", "IB", "II", "IIB", "IIC", "III", "IIID", "IIIF", "XA", "XB", "XC"), 
    100, TRUE)
table(x, exclude=NULL)

#    x
#   I   IA   IB   II  IIB  IIC  III IIID IIIF   XA   XB   XC <NA> 
#   5   12    9    7    9   11    6    8    6   12    9    6    0 

我的问题是如何容易地将x分解成四种元素,例如I、II、III和X?将I、IA、IB组合成I等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-31 15:18:13

更普遍的情况是,如果您的分类变量没有按此类模式分组,则可以使用case_whendplyr指定映射

代码语言:javascript
复制
y <- case_when(x %in% c("I", "IA", "IB") ~ "I", #or whatever conditions you want
               x %in% c("II", "IIA", "IIB") ~ "II", #as above
               TRUE ~ "III")
table(y)

  I  II III 
 33  24  43 
票数 4
EN

Stack Overflow用户

发布于 2017-08-31 15:11:52

这里有一个选择:

代码语言:javascript
复制
table(gsub("[^I]", "", x))

#   I  II III 
#  33  34  33 

这将替换向量中的所有非I字符,然后计算其频率。

或者,更改x

代码语言:javascript
复制
x <- gsub("[^I]", "", x)
票数 4
EN

Stack Overflow用户

发布于 2017-08-31 15:22:30

问题后的编辑的已经更新。

forcats包有一些处理因素的方便的功能。

fct_collapse()函数可用于将因子级别折叠为手动定义的组:

代码语言:javascript
复制
y <- forcats::fct_collapse(x, 
                           I   = c("I", "IA", "IB"),
                           II  = c("II", "IIB", "IIC"),
                           III = c("III", "IIID", "IIIF"),
                           X   = c("XA", "XB", "XC"))
table(y, exclude=NULL)

Y I II III X 26 27 20 27

fct_relabel()函数会根据需要自动重命名因子级别并折叠。它接受一个应用于每个级别的函数,该函数接受一个字符参数,并返回一个长度相同的字符向量作为输入。这里使用的函数从开头提取IX字符的序列。

代码语言:javascript
复制
y <- forcats::fct_relabel(factor(x), stringr::str_extract, pattern = "^I+|X+")
table(y, exclude=NULL)

Y I II III X 26 27 20 27

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45984705

复制
相关文章

相似问题

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