Considere el siguiente dt
:
dt <- data.table(a=c(1,1,2,3),b=c(4,5,6,4))
Que se parece a:
> dt
a b
1: 1 4
2: 1 5
3: 2 6
4: 3 4
Estoy aquí agregación de cada columna por lo que los valores de y, a continuación, contar cuántas uniquye los valores de cada columna tiene:
> dt[,lapply(.SD,function(agg) dt[,.N,by=agg])]
a.agg a.N b.agg b.N
1: 1 2 4 2
2: 2 1 5 1
3: 3 1 6 1
Así 1
aparece dos veces en dt
y así a.N
es 2
la misma lógica se extiende por el resto de los valores.
Pero el problema es que si este transformaciones de la original datatable
tienen diferentes dimensiones al final, las cosas se reciclan.
Por ejemplo este dt
:
dt <- data.table(a=c(1,1,2,3,7),b=c(4,5,6,4,4))
> dt[,lapply(.SD,function(agg) dt[,.N,by=agg])]
a.agg a.N b.agg b.N
1: 1 2 4 3
2: 2 1 5 1
3: 3 1 6 1
4: 7 1 4 3
Warning message:
In as.data.table.list(jval, .named = NULL) :
Item 2 has 3 rows but longest item has 4; recycled with remainder.
Que ya no es la respuesta correcta porque b.N
debe tener ahora sólo 3
las filas y las cosas(vector) se recicla.
Esta es la razón por la que me gustaría transformar la expresión dt[,lapply(.SD,function(agg) dt[,.N,by=agg])]
en una lista con diferentes dimensiones, con el nombre de los elementos de la lista el nombre de las columnas en el nuevo transformado dt
.
Un boceto de lo que quiero decir es:
newlist
$a.agg
1 2 3 7
$a.N
2 1 1 1
$b.agg
4 5 6 4
$b.N
3 1 1
O incluso mejor solución sería conseguir un datatable
con una pista de las columnas en otra columna:
dt_final
agg N column
1 2 a
2 1 a
3 1 a
7 1 a
4 3 b
5 1 b
6 1 b
measure.vars = colnames(d)
si usted tiene varios miles de columnas.