Créer une liste de colonnes du tableau de données d'expression

0

La question

Considérez les points suivants dt:

dt <- data.table(a=c(1,1,2,3),b=c(4,5,6,4))

Qui ressemble à ça:

> dt
   a b
1: 1 4
2: 1 5
3: 2 6
4: 3 4

Je suis ici l'agrégation de chaque colonne, de par les valeurs uniques et puis en comptant combien de uniquye les valeurs de chaque colonne de a:

 > 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

Donc 1 apparaît deux fois dans dt et donc a.N est 2la même logique se passe pour les autres valeurs.

Mais le problème est de savoir si cette transformation de l'original datatable avoir des dimensions différentes à la fin, les choses vont s'recyclé.

L'exemple de ce 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.

Ce n'est plus la bonne réponse parce que b.N devriez avoir maintenant seulement 3 les lignes et les choses(vecteur) s'est recyclé.

C'est pourquoi je voudrais transformer l'expression dt[,lapply(.SD,function(agg) dt[,.N,by=agg])] dans une liste avec des dimensions différentes, avec le nom de l'élément dans la liste le nom des colonnes dans le nouveau transformé dt.

Une esquisse de ce que je veux dire, c'est:

newlist
$a.agg
1 2 3 7
$a.N
2 1 1 1
$b.agg
4 5 6 4
$b.N
3 1 1

Ou encore une meilleure solution serait d'obtenir un datatable avec une piste de colonnes sur une autre colonne:

    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

La meilleure réponse

2

Obtenir les données dans le format long, puis agrégées par groupe.

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

Dans tidyverse -

library(dplyr)
library(tidyr)

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

belle :) . measure.vars = colnames(d) si vous avez plusieurs milliers de colonnes.
moth

Dans d'autres langues

Cette page est dans d'autres langues

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