我在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
,Energia,Petroleo,Gas,Mineria
和Gobienro
进行分组,并为其分配代码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语句。
答案 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
特定解决方案。