Crear una lista de columnas de la tabla de datos de expresión

0

Pregunta

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 2la 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
data.table r
2021-11-24 04:02:29
1

Mejor respuesta

2

Obtener los datos en formato largo y, a continuación, agregado por el grupo.

library(data.table)

dt_long <- melt(dt, measure.vars = c('a', 'b'))
dt_long[, .N, .(variable, value)]

#   variable value N
#1:        a     1 2
#2:        a     2 1
#3:        a     3 1
#4:        a     7 1
#5:        b     4 3
#6:        b     5 1
#7:        b     6 1

En tidyverse -

library(dplyr)
library(tidyr)

dt %>%
  pivot_longer(cols = everything()) %>%
  count(name, value)
2021-11-24 06:03:29

hermoso :) . measure.vars = colnames(d) si usted tiene varios miles de columnas.
moth

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................