基于R中data.table中的另一个因素聚合一个因素

基于R中data.table中的另一个因素聚合一个因素,r,data.table,aggregate,R,Data.table,Aggregate,我有一个R数据。表对象DT如下: library(ggplot2) library(data.table) DT <- movies[movies$mpaa %in% c("NC-17", "PG", "PG-13", "R"), c("rating", "title", "mpaa")] setDT(DT) setnames(DT, colnames(DT), c("Gp", "ID", "FACTOR")) DT[, FACTOR := droplevels(FACTOR)] DT[

我有一个
R
数据。表
对象
DT
如下:

library(ggplot2)
library(data.table)

DT <- movies[movies$mpaa %in% c("NC-17", "PG", "PG-13", "R"), c("rating", "title", "mpaa")]
setDT(DT)
setnames(DT, colnames(DT), c("Gp", "ID", "FACTOR"))
DT[, FACTOR := droplevels(FACTOR)]
DT[, Gp := as.numeric(as.factor(Gp))]
setkey(DT, ID)
DT <- unique(DT)

DT
      Gp                       ID FACTOR
   1: 43                  $windle      R
   2: 61             'A' gai waak  PG-13
   3: 62    'A' gai waak juk jaap  PG-13
   4: 39                  'R Xmas      R
   5: 38       'Til There Was You  PG-13
  ---                                   
4899: 57                  Zuotian      R
4900: 27 Zyosyuu syukeininn Maria      R
4901: 57                 eXistenZ      R
4902: 45                      xXx  PG-13
4903: 29  xXx: State of the Union  PG-13

对于每个级别的
Gp
,我想获得每个级别的
因子的记录数。如何单独使用
data.table
更优雅地获得所需的结果
k

您可以使用
as.list(table(FACTOR))
在每组
Gp
中:

DT[, as.list(table(FACTOR)), by = Gp]
结果如下:

    Gp NC-17 PG PG-13  R
 1: 43     1  8    26 79
 2: 61     2  9    22 77
 3: 62     0  7    18 63
 4: 39     0 17    24 52
 5: 38     1 14    13 77
 6: 57     1 11    23 72
 7: 48     0 16    29 78
...

(要按示例输出中的
Gp
对它们进行排序,您可以将其更改为
DT[order(Gp),as.list(table(FACTOR)),by=Gp]

您可以在
Gp
的每组中使用
as.list(table(FACTOR))

DT[, as.list(table(FACTOR)), by = Gp]
结果如下:

    Gp NC-17 PG PG-13  R
 1: 43     1  8    26 79
 2: 61     2  9    22 77
 3: 62     0  7    18 63
 4: 39     0 17    24 52
 5: 38     1 14    13 77
 6: 57     1 11    23 72
 7: 48     0 16    29 78
...

(要按照示例输出中的
Gp
对它们进行排序,可以将其更改为
DT[order(Gp),as.list(table(FACTOR)),by=Gp]

我建议使用
dcast

require(data.table) # v1.9.4
dcast.data.table(DT, Gp ~ FACTOR, fun.aggregate = length)
或者从(以及将来的版本)中,我们可以直接使用
dcast()

as.list()。而
table()
是另一个缓慢的函数

dcast()
也会根据
Gp
列自动对结果排序


这里有一个足够大的基准来突出区别:

set.seed(1L)
bmark = data.table(Gp = sample(1e5, 1e7, TRUE), 
                   FACTOR = sample(levels(DT$FACTOR), 1e7, TRUE))
print(object.size(bmark), units="Mb")
# 114.4 Mb

system.time(ans1 <- dcast(bmark, Gp ~ FACTOR, fun.aggregate = length))
#    user  system elapsed 
#   0.998   0.026   1.030 

system.time(ans2 <- bmark[, as.list(table(FACTOR)), by=Gp])
#    user  system elapsed 
#  14.666   0.141  15.078 

identical(ans1, setkey(ans2, Gp))
# [1] TRUE
set.seed(1L)
bmark=data.table(Gp=sample(1e5,1e7,TRUE),
系数=样本(水平(DT$系数),1e7,真)
打印(对象大小(bmark),单位=“Mb”)
#114.4 Mb

system.time(ans1我建议使用
dcast
来:

require(data.table) # v1.9.4
dcast.data.table(DT, Gp ~ FACTOR, fun.aggregate = length)
或者从(以及将来的版本)中,我们可以直接使用
dcast()

as.list()

dcast()
也会根据
Gp
列自动对结果排序


这里有一个足够大的基准来突出区别:

set.seed(1L)
bmark = data.table(Gp = sample(1e5, 1e7, TRUE), 
                   FACTOR = sample(levels(DT$FACTOR), 1e7, TRUE))
print(object.size(bmark), units="Mb")
# 114.4 Mb

system.time(ans1 <- dcast(bmark, Gp ~ FACTOR, fun.aggregate = length))
#    user  system elapsed 
#   0.998   0.026   1.030 

system.time(ans2 <- bmark[, as.list(table(FACTOR)), by=Gp])
#    user  system elapsed 
#  14.666   0.141  15.078 

identical(ans1, setkey(ans2, Gp))
# [1] TRUE
set.seed(1L)
bmark=data.table(Gp=sample(1e5,1e7,TRUE),
系数=样本(水平(DT$系数),1e7,真)
打印(对象大小(bmark),单位=“Mb”)
#114.4 Mb
系统时间(ans1)