Vytvořit seznam sloupců dat tabulka výraz

0

Otázka

Zvažte následující dt:

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

To vypadá jako, že:

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

Jsem tu agregaci jednotlivých sloupců je jedinečné hodnoty a pak počítat, kolik uniquye hodnoty každého sloupce, který má:

 > 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

Tak 1 objeví dvakrát v dt a tak a.N je 2, stejnou logikou pokračuje na jiné hodnoty.

Ale problém je, pokud to transformací z původní datatable mají různé rozměry, na konci, všechno bude recyklován.

Například tento 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.

Již to není správná odpověď, protože b.N měl teď jen 3 řádky a věci(vektor) dostal recyklovány.

To je důvod, proč chtěl bych změnit výraz dt[,lapply(.SD,function(agg) dt[,.N,by=agg])] v seznamu s různými rozměry, s jméno položky v seznamu je název sloupce v nové transformované dt.

Nástin toho, co mám na mysli, je:

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

Nebo ještě lepší řešení by bylo, aby si datatable s trati sloupce na další sloupce:

    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

Nejlepší odpověď

2

Získat data v dlouhém formátu a potom agregovat do skupin.

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

V tidyverse -

library(dplyr)
library(tidyr)

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

krásné :) . measure.vars = colnames(d) pokud máte několik tisíc sloupců.
moth

V jiných jazycích

Tato stránka je v jiných jazycích

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