2013-03-20 10 views
9

私は因子を多少使用することはほとんどなく、一般的にそれらを分かりやすくしていますが、特定の操作の詳細についてはあまり曖昧です。現在、私は「他者」への観察がほとんどないカテゴリをコーディング/コラプスしています。これを行うための素早い方法を探しています。おそらく20レベルの変数がありますが、それらの変数を1つにまとめることに興味があります。ここでR:因子レベル、recode rest to 'other'

data<-data.frame(employees=sample.int(1000,500), 
     naics=sample(c('621111','621112','621210','621310','621320','621330','621340','621391','621399','621410','621420','621491','621492','621493','621498','621511','621512','621610','621910','621991','621999'),100,replace=T) 

関心の私のレベル、および別々のベクターでのラベルです。

#levels and labels 
top8 <-c('621111','621210','621399','621610','621330','621310','621511','621420','621320') 
top8_desc <- c('Offices of physicians', 
      'Offices of dentists', 
      'Offices of all other miscellaneous health practitioners', 
      'Home health care services', 
      'Offices of Mental Health Practitioners', 
      'Offices of chiropractors', 
      'Medical Laboratories', 
      'Outpatient Mental Health and Substance Abuse Centers', 
      'Offices of optometrists') 

私は、カテゴリは、いくつかの観測を持っていたたびに、「その他」として分類し、それらすべてを列挙、factor()コールを使用することができます。

上記の「top8」と「top8_desc」が実際のトップ8であると仮定すると、$ naicsというデータを要素変数として宣言し、その他のものを「その他」としてコード化する最良の方法は何ですか?

答えて

6

私は最も簡単な方法は、特別な値にトップ8にないすべてのnaicsをrelabelすることだと思う。要因私がかもしれ他人に役に立つことができる、これを行うための機能を書かれている

factor(data$naics, exclude=-99) 
+1

フムすることができますplyr::mapvaluesのラッパーであり、しかし、それはおそらく最初に何らかの要因としてのコーディングが行われているのでしょう。それほど重要ではないと思います。 – ako

+1

変換されたコードを使用して、データフレーム内に常に追加の列を作成できます。 – kith

+1

私はあなたの応答のこのバリエーションを試しました: 'levels(data $ naics)[which(level $ data)%])< - " other "' – ako

0

にそれを回すとき

data$naics[!(data$naics %in% top8)] = -99 

次に、あなたが「除外」オプションを使用することができますか? 私は最初に相対的な方法でチェックします。もしレベルがベースのmpパーセント以下であればチェックします。その後、最大レベル数をmlに制限してチェックします。

dsは、data.frameタイプのデータセットです。これは、cat_var_namesにファクタとして表示されるすべてのカラムに対して実行されます。

cat_var_names <- names(clean_base[sapply(clean_base, is.factor)]) 

recodeLevels <- function (ds = clean_base, var_list = cat_var_names, mp = 0.01, ml = 25) { 
    # remove less frequent levels in factor 
    # 
    n <- nrow(ds) 
    # keep levels with more then mp percent of cases 
    for (i in var_list){ 
    keep <- levels(ds[[i]])[table(ds[[i]]) > mp * n] 
    levels(ds[[i]])[which(!levels(ds[[i]])%in%keep)] <- "other" 
    } 

    # keep top ml levels 
    for (i in var_list){ 
    keep <- names(sort(table(ds[i]),decreasing=TRUE)[1:ml]) 
    levels(ds[[i]])[which(!levels(ds[[i]])%in%keep)] <- "other" 
    } 
    return(ds) 
} 
+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、自分の投稿の下にコメントを残してください。自分の投稿にいつもコメントをつけることができます。そして、十分な[評判](http://stackoverflow.com/help/whats-reputation) [任意の投稿にコメントする]ことができます(http://stackoverflow.com/help/privileges/comment)。 – Sliq

3

後半エントリここ

は離れ分類を変更することとは対照的に、実際に投げたデータを必要とするremaining引数(あなたother

library(plyr) 

Mapvalues <- function(x, from, to, warn_missing= TRUE, remaining = NULL){ 
    if(!is.null(remaining)){ 
    therest <- setdiff(x, from) 
    from <- c(from, therest) 
    to <- c(to, rep_len(remaining, length(therest))) 
    } 
    mapvalues(x, from, to, warn_missing) 
} 
# replace the remaining values with "other" 
Mapvalues(data$naics, top8, top8_desc,remaining = 'other') 
# leave the remaining values alone 
Mapvalues(data$naics, top8, top8_desc) 
関連する問題