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 Forestal、和进行分组Asociaciones,并为它们分配代码 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。该[函数通常非常快,尤其是在数据表对象中:

 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 回答