1

にデータテーブル(DatosMex)がRあり、その中に。という名前の列を再コーディングしたいと思いますindustry。この変数の明確なカテゴリは次のとおりです。

  Agricultura,Ganaderia,Pesca,Caza Forestal                      
  Asociaciones                                                       
  Comercio                                                       
  Construccion                                                   
  Energia,Petroleo,Gas,Mineria                                   
  Gobierno                                                       
  Industria                                                      
  N/A                                                            
  NULL                                                           
  Servicios                      

gr_industryたとえば、いくつかのカテゴリをグループ化する新しい変数を作成したいと思います。たとえば、私の新しい変数は、カテゴリ、、をグループ化しAgricultura,Ganaderia,Pesca,Caza ForestalAsociacionesそれらにコード1を割り当てる必要がありますEnergia,Petroleo,Gas,MineriaGobienro

data.tableパッケージ構文を使用してこれをどのように行いますか?

私のアプローチはこれでした:

 #Create an id for each industry
 DatosMex[,cod_industria:=as.numeric(DatosMex$industry)] 
 #Create a new data table
 ind =data.table(cod_industria=c(1:10),gr_industry=c(1,1,2,3,1,1,4,6,6,5))
 setkey(DatosMex,cod_industria)
 setkey(ind,cod_industria)
 DatosMex[ind] 

したがって、ご覧のとおり、新しいデータテーブルを作成してからind、内部結合を実行する必要がありました。私の質問は、この方法を使用してこれを行う別の方法はありdata.tableますか?同様のことをする必要があるたびにテーブルを作成したくありません。また、ifステートメントの使用は避けたいと思います。

4

2 に答える 2

4

キーを設定したり、新しいdata.tableを作成したりする必要はないと思います。この[関数は、特にdatatable-objectsで一般的に非常に高速です。

 DatosMex[, gr_industry := c(1,1,2,3,1,1,4,6,6,5)[cod_industria] ]

そのグループ化変換ベクトルが大きい場合は、data.tableの外にある場合でも、名前で参照できます。

 dta <- data.table(a=sample(1:10, 20, repl=TRUE))
 g6<- c(1,1,2,3,1,1,4,6,6,5)
 dta[ , ind := g6[a] ]
 #-------------------
     a ind
 1:  8   6
 2:  4   3
 3: 10   5
 4:  8   6
 snipped output
于 2012-08-09T23:59:30.747 に答える
2

コード編成の観点から、ある時点で再コーディングを定義する必要があります。

  • data.tableまたは_
  • スイッチ機能。

スイッチ機能の例を次に示します

  ## a function that will `switch` based on the levels 1:10
  ## note that it is Vectorized (to avoid calling `sapply`
  switch_industry <- Vectorize(function(i) { switch(i, 1,1,2,3,1,1,4,6,6,5)})


  DatosMex[, gr_industry := switch_industry(cod_industria)]

私はこれを特定の解決策とは呼びませんdata.table

于 2012-08-09T23:40:12.110 に答える