Veri tablosu ifadesi sütunlarından liste oluşturma

0

Soru

Aşağıdakileri göz önünde bulundurun dt:

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

Böyle görünüyor :

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

Burada her sütunu benzersiz değerlere göre topluyorum ve sonra her sütunun kaç tane uniquye değerine sahip olduğunu sayıyorum:

 > 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

Böyle 1 iki kez görünür dt ve böylece a.N oluyor 2 aynı mantık diğer değerler için de geçerlidir.

Ancak sorun, orijinalin bu dönüşümleri ise datatable sonunda farklı boyutlara sahip olun, işler geri dönüştürülecektir.

Örneğin bu 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.

Bu artık doğru cevap değil çünkü b.N sadece şimdi olmalıydı. 3 satırlar ve şeyler (vektör) geri dönüştürüldü.

Bu yüzden ifadeyi dönüştürmek istiyorum dt[,lapply(.SD,function(agg) dt[,.N,by=agg])] farklı boyutlara sahip bir listede, listedeki öğelerin adı yeni dönüştürülen sütunların adıdır dt.

Ne demek istediğimin bir taslağı:

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

Ya da daha iyi bir çözüm elde etmek olurdu datatable başka bir sütundaki sütunların iziyle:

    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

En iyi cevabı

2

Verileri uzun biçimde alın ve ardından gruba göre toplayın.

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

İçinde tidyverse -

library(dplyr)
library(tidyr)

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

güzel :) . measure.vars = colnames(d) birkaç bin sütununuz varsa.
moth

Diğer dillerde

Bu sayfa diğer dillerde

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