Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用data.table分组时,如何保留输入数据中未出现的变量组合?_R_Data.table - Fatal编程技术网

R 使用data.table分组时,如何保留输入数据中未出现的变量组合?

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

使用软件包,是否可以对输入中未出现的变量的数据保存组合进行汇总

对于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","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