[英]Combining factor level in R
我想将级别“ A”,“ B”组合为“ A + B”。 我通过以下方式成功做到了这一点:
x <- factor(c("A","B","A","C","D","E","A","E","C"))
x
#[1] A B A C D E A E C
#Levels: A B C D E
l <- c("A+B","A+B","C","D+E","D+E")
factor(l[as.numeric(x)])
#[1] A+B A+B A+B C D+E D+E A+B D+E C
#Levels: A+B C D+E
还有其他更简单的方法吗? (即,更具解释性的函数名称,例如Combine.factor(f,old.levels,new.levels)将有助于更轻松地理解代码。)
另外,我尝试找到一个命名函数,该函数可能与dplyr包中的数据帧一起使用,但是没有运气。 最接近的实现是
df %>% mutate(x = factor(l[as.numeric(x)]))
现在,使用forcats
包中的fct_collapse()
轻松完成此forcats
。
x <- factor(c("A","B","A","C","D","E","A","E","C"))
library(forcats)
fct_collapse(x, AB = c("A","B"), DE = c("D","E"))
#[1] AB AB AB C DE DE AB DE C
#Levels: AB C DE
一种选择是从car
上recode
library(car)
recode(x, "c('A', 'B')='A+B';c('D', 'E') = 'D+E'")
#[1] A+B A+B A+B C D+E D+E A+B D+E C
#Levels: A+B C D+E
它也应该与dplyr
一起dplyr
library(dplyr)
df %>%
mutate(x= recode(x, "c('A', 'B')='A+B';c('D', 'E') = 'D+E'"))
# x
#1 A+B
#2 A+B
#3 A+B
#4 C
#5 D+E
#6 D+E
#7 A+B
#8 D+E
#9 C
df <- data.frame(x)
使用ifelse()
创建新因子怎么样?
x = factor(c("A","B","A","C","D","E","A","E","C"))
# chained comparisons, a single '|' works on the whole vector
y = as.factor(
ifelse(x=='A'|x=='B',
'A+B',
ifelse(x=='D'|x=='E','D+E','C')
)
)
> y
[1] A+B A+B A+B C D+E D+E A+B D+E C
Levels: A+B C D+E
# using %in% to search
z = as.factor(
ifelse(x %in% c('A','B'),
'A+B',
ifelse(x %in% c('D','E'),'D+E','C'))
)
> z
[1] A+B A+B A+B C D+E D+E A+B D+E C
Levels: A+B C D+E
如果您不想在上面的因子级别C
进行硬编码,或者如果有多个因子级别不需要组合,则可以使用以下代码。
# Added new factor levels
x = factor(c("A","B","A","C","D","E","A","E","C","New","Stuff","Here"))
w = as.factor(
ifelse(x %in% c('A','B'),
'A+B',
ifelse(x %in% c('D','E'),
'D+E',
as.character(x) # without the cast it's numeric
)
)
)
> w
[1] A+B A+B A+B C D+E D+E A+B D+E C New Stuff Here
Levels: A+B C D+E Here New Stuff
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.