gpt4 book ai didi

r - “by”数据表中的空因素

转载 作者:行者123 更新时间:2023-12-04 01:59:35 26 4
gpt4 key购买 nike

我有一个data.table,其中有空列的factor列。我需要获取行数和其他变量的总和,所有这些变量均由多个因素分组,其中包括空级别的因素。
我的问题与此one类似,但在这里我需要考虑多个因素。

例如,让data.table为:

library('data.table')

dtr <- data.table(v1=sample(1:15),
v2=factor(sample(letters[1:3], 15, replace = TRUE),levels=letters[1:5]),
v3=sample(c("yes", "no"), 15, replace = TRUE))


我要执行以下操作:

dtr[,list(freq=.N,mm=sum(v1,na.rm=T)),by=list(v2,v3)]

#Output is:
v2 v3 freq mm
1: b yes 4 22
2: b no 1 13
3: c no 3 10
4: a no 4 49
5: c yes 1 10
6: a yes 2 16


我希望输出也包括v2的空白级别(“ d”和“ e”),就像在 table(dtr$v2,dtr$v3)中一样,因此最终输出应该看起来像(顺序无关紧要):

   v2  v3 freq mm
1: b yes 4 22
2: b no 1 13
3: c no 3 10
4: a no 4 49
5: c yes 1 10
6: a yes 2 16
7: d yes 0 0
8: d no 0 0
9: e yes 0 0
10: e no 0 0


我尝试使用链接中使用的方法,但是当使用多个列时,我不确定如何使用联合J()函数。

这仅适用于按1列分组:

setkey(dtr,v2)
dtr[J(levels(v2)),list(freq=.N,mm=sum(v1,na.rm=T))]


但是, dtr[J(levels(v2),v3),list(freq=.N,mm=sum(v1,na.rm=T))]并不包括所有组合

最佳答案

library(data.table)
set.seed(42)
dtr <- data.table(v1=sample(1:15),
v2=factor(sample(letters[1:3], 15, replace = TRUE),levels=letters[1:5]),
v3=sample(c("yes", "no"), 15, replace = TRUE))

res <- dtr[,list(freq=.N,mm=sum(v1,na.rm=T)),by=list(v2,v3)]


您可以使用 CJ(交叉联接)。聚合后执行此操作可避免为大表设置键,因此应更快。

setkeyv(res,c("v2","v3"))
res[CJ(levels(dtr[,v2]),unique(dtr[,v3])),]

# v2 v3 freq mm
# 1: a no 1 9
# 2: a yes 2 11
# 3: b no 2 11
# 4: b yes 3 23
# 5: c no 4 40
# 6: c yes 3 26
# 7: d no NA NA
# 8: d yes NA NA
# 9: e no NA NA
# 10: e yes NA NA

关于r - “by”数据表中的空因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18866796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com