假设我有一个分类变量,如:
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等。
发布于 2017-08-31 15:18:13
更普遍的情况是,如果您的分类变量没有按此类模式分组,则可以使用case_when从dplyr指定映射
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 发布于 2017-08-31 15:11:52
这里有一个选择:
table(gsub("[^I]", "", x))
# I II III
# 33 34 33 这将替换向量中的所有非I字符,然后计算其频率。
或者,更改x
x <- gsub("[^I]", "", x)发布于 2017-08-31 15:22:30
问题后的编辑的已经更新。
forcats包有一些处理因素的方便的功能。
fct_collapse()函数可用于将因子级别折叠为手动定义的组:
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()函数会根据需要自动重命名因子级别并折叠。它接受一个应用于每个级别的函数,该函数接受一个字符参数,并返回一个长度相同的字符向量作为输入。这里使用的函数从开头提取I或X字符的序列。
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
https://stackoverflow.com/questions/45984705
复制相似问题