在R中合并因子水平

14

我希望将等级"A"和"B"合并成"A+B"。我通过以下方式成功地完成了此操作:

I would like combine level "A","B" into "A+B". I successfully did this by the following:

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)]))

你不需要使用 as.numeric,也就是说 factor(l[x]) 也可以。而且你可以轻松地编写自己的 combine.factor 函数。 - talat
还有 levels(x)<-l 也是可以的。 - nicola
3个回答

13

现在使用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

8

一个选项是使用 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一起使用。

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)

1
使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接