结合R 3.2.1中的因子水平

Mod*_*rat 2 types r

在先前版本的RI中,可以使用以下小函数组合没有"显着"音量阈值的因子级别:

whittle = function(data, cutoff_val){
  #convert to a data frame
  tab = as.data.frame.table(table(data))
  #returns vector of indices where value is below cutoff_val
  idx = which(tab$Freq < cutoff_val)
  levels(data)[idx] = "Other"
  return(data)
}
Run Code Online (Sandbox Code Playgroud)

这需要一个因子向量,寻找不会出现"经常"的水平,并将所有这些水平组合成一个"其他"因子水平.一个例子如下:

> sort(table(data$State))

   05    27    35    40    54    84     9    AP    AU    BE    BI    DI     G    GP    GU    GZ    HN    HR    JA    JM    KE    KU     L    LD    LI    MH    NA 
    1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1 
   OU     P    PL    RM    SR    TB    TP    TW     U    VD    VI    VS    WS     X    ZH    47    BL    BS    DL     M    MB    NB    RP    TU    11    DU    KA 
    1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     2     2     2     2     2     2     2     2     2     3     3     3 
   BW    ND    NS    WY    AK    SD    13    QC    01    BC    MT    AB    HE    ID     J    NO    LN    NM    ON    NE    VT    UT    IA    MS    AO    AR    ME 
    4     4     4     4     5     5     6     6     7     7     7     8     8     8     9    10    11    17    23    26    26    30    31    31    38    40    44 
   OR    KS    HI    NV    WI    OK    KY    IN    WV    AL    CO    WA    MN    NH    MO    SC    LA    TN    AZ    IL    NC    MI    GA    OH    **    CT    DE 
   45    47    48    57    57    64   106   108   112   113   120   125   131   131   135   138   198   200   233   492   511   579   645   646   840   873  1432 
   RI    DC    TX    MA    FL    VA    MD    CA    NJ    PA    NY 
 1782  2513  6992  7027 10527 11016 11836 12221 15485 16359 34045 
Run Code Online (Sandbox Code Playgroud)

现在当我使用whittle它时返回以下消息:

> delete = whittle(data$State, 1000)
Warning message:
In `levels<-`(`*tmp*`, value = c("Other", "Other", "Other", "Other",  :
  duplicated levels in factors are deprecated
Run Code Online (Sandbox Code Playgroud)

如何修改我的功能以使其具有相同的效果但不使用这些"已弃用"的因子级别?转换为字符,制表,然后转换为字符"其他"?

jos*_*ber 7

我总是发现转换为字符并返回进行这些操作最简单(减少键入和减少头痛).与您保持as.data.frame.table并使用replace替换低频级别:

whittle <- function(data, cutoff_val) {
  tab = as.data.frame.table(table(data))
  factor(replace(as.character(data), data %in% tab$data[tab$Freq < cutoff_val], "Other"))
}
Run Code Online (Sandbox Code Playgroud)

测试一些样本数据:

state <- factor(c("MD", "MD", "MD", "VA", "TX"))
whittle(state, 2)
# [1] MD    MD    MD    Other Other
# Levels: MD Other
Run Code Online (Sandbox Code Playgroud)


MrF*_*ick 5

我认为这个版本应该有效.该levels<-功能允许您通过分配列表进行折叠(请参阅参考资料?levels).

whittle <- function(data, cutoff_val){
  tab <- table(data)
  shouldmerge <- tab < cutoff_val
  tokeep <- names(tab)[!shouldmerge]
  tomerge <- names(tab)[shouldmerge]
  nv <- c(as.list(setNames(tokeep,tokeep)), list("Other"=tomerge))
  levels(data)<-nv
  return(data)
}
Run Code Online (Sandbox Code Playgroud)

我们用它来测试它

set.seed(15)
x<-factor(c(sample(letters[1:10], 100, replace=T), sample(letters[11:13], 10, replace=T)))
table(x)
# x
#  a  b  c  d  e  f  g  h  i  j  k  l  m 
#  5 11  8  8  7  5 13 14 14 15  2  3  5 

y <- whittle(x, 9)
table(y)
# y
#     b     g     h     i     j Other 
#    11    13    14    14    15    43 
Run Code Online (Sandbox Code Playgroud)