基于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)