gpt4 book ai didi

r - 与data.table分组时,如何保留未出现在输入数据中的变量组合?

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

使用data.table包,是否可以汇总保留输入中未出现的变量组合的数据?

使用plyr包,我知道如何使用.drop参数执行此操作,例如:

require(plyr)
df <- data.frame(categories = c(rep("A",3), rep("B",3), rep("C",3)), groups = c(rep(c("X", "Y"),4), "Z"), values = rep(1, 9))

df1 <- ddply(df, c("categories","groups"), .drop = F, summarise, sum = sum(values))

输出:
 categories groups sum
1 A X 2
2 A Y 1
3 A Z 0
4 B X 1
5 B Y 2
6 B Z 0
7 C X 1
8 C Y 1
9 C Z 1

在这种情况下,即使总和为0,我也会保留所有组/类别组合。

最佳答案

好问题。这有两种方法。他们都使用逐个。

DT = as.data.table(df)
setkey(DT,categories,groups)
DT[CJ(unique(categories),unique(groups)), sum(values,na.rm=TRUE)]

categories groups V1
1: A X 2
2: A Y 1
3: A Z 0
4: B X 1
5: B Y 2
6: B Z 0
7: C X 1
8: C Y 1
9: C Z 1

其中 CJ表示交叉连接,请参见 ?CJ。 by-with-by只是意味着 ji的每一行加入的每个组上执行。

诚然,乍一看它看起来很棘手。这个想法是,如果您有一个已知的组子集,则此语法比对所有内容进行分组然后从所需的结果中选择结果的速度要快。但是在这种情况下,无论如何您还是想要所有东西,所以除了可以查找数据中不存在的组(您无法使用 by进行查找)之外,它没有太多优势。

另一种方法是先像平常一样先 by,然后将 CJ()结果加入其中:
DT[,sum(values),keyby='categories,groups'][CJ(unique(categories),unique(groups))]
categories groups V1
1: A X 2
2: A Y 1
3: A Z NA
4: B X 1
5: B Y 2
6: B Z NA
7: C X 1
8: C Y 1
9: C Z 1

但是您会得到NA而不是所需的0。可以根据需要使用 set()替换它们。第二种方法可能会更快,因为两个 unique调用的输入要小得多。

如果您经常这样做,那么这两种方法都可以包装成小的辅助函数。

关于r - 与data.table分组时,如何保留未出现在输入数据中的变量组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14485687/

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