如何使用data.table执行此操作?

时间:2012-08-09 23:17:36

标签: r data.table

我在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 ForestalAsociacionesEnergia,Petroleo,Gas,MineriaGobienro进行分组,并为其分配代码1.

如何使用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语句。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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特定解决方案。