簡體   English   中英

R中的組合因子水平

[英]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

一種選擇是從carrecode

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM