2017-08-31 28 views
2

假設我有一個分類變量等類如何摺疊分類變量到更少的元件中的R

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組合成我等

+2

'因子(GSUB( '[^ I]', '',x)時,strrep('I ',1:3))''但是我認爲這是你真正需要的簡單情況 – rawr

回答

2

更一般地,如果你的分類變量沒有被這種方式分組,您可以從dplyr指定使用case_when映射:

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

這裏有一個選項:

table(gsub("[^I]", "", x)) 

# I II III 
# 33 34 33 

這將替換不I從向量中的所有字符,然後計算其頻率。

或者改變x

x <- gsub("[^I]", "", x) 
+0

謝謝,也許我的問題不是很清楚,但我也可能有XA,XB,XC。我會更新它是明確的.. –

+3

我的意思是這個答案仍然會工作'表(gsub(「[^ IX]」,「」,x))' – rawr

+0

數字不加起來...例如'我'應該是'26' ... – useR

1

問題更新後編輯

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()功能自動重標記因子水平並在必要時崩潰。它接受一個應用於每個級別的函數,該函數接受一個字符參數並返回與其輸入相同長度的字符向量。這裏使用的函數提取的IX字符的序列從開始

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