R 使用data.table分组时,如何保留输入数据中未出现的变量组合?
使用软件包,是否可以对输入中未出现的变量的数据保存组合进行汇总 对于package,我知道如何使用.drop参数执行此操作,例如:R 使用data.table分组时,如何保留输入数据中未出现的变量组合?,r,data.table,R,Data.table,使用软件包,是否可以对输入中未出现的变量的数据保存组合进行汇总 对于package,我知道如何使用.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","grou
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))
在这种情况下,我保留所有组/类别组合,即使其总和为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
。而不只是意味着j
在i
的每一行加入的每个组上执行
令人钦佩的是,乍一看它看起来很棘手。其思想是,如果您有一个已知的组子集,那么这种语法比将所有内容分组然后仅从中选择所需的结果要快。但在这种情况下,您无论如何都会喜欢所有内容,因此除了能够查找数据中不存在的组(您不能通过使用)之外,没有什么好处
另一种方法是先按
正常方式进行,然后将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
调用的输入要小得多
如果您经常这样做,这两种方法都可以包装成小的辅助函数。第一种方法不再有效(我正在运行data.table 1.12版)。第二个选项是CJ的唯一选项: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