组合 DT returns 错误 "n < m"

combn on grouped DT returns error "n < m"

我有一个包含 31557 个观测值的数据集,以及变量 Order.number 和材料。我正在尝试在 R:

中 运行

第一个:

DT <- data.table(Order.number=X$Order.number, Materials=X$Materials)
setorder(DT, Order.number, Materials)

然后:

library(data.table)    
ans <- DT[, as.data.table(do.call(rbind, combn(Materials, 2, simplify=FALSE))), 
      by=Order.number][,
                       .N, by=.(V1, V2)]

但我在 combn(Materials, 2, simplify = FALSE) : n < m

中收到错误

如果我只使用随机生成的table,它就可以工作。那会不会和我的数据集有关?

编辑:我尝试使用 ,但在 do.call(rbind, function(x) if (length(x) > 1) { 中出现错误: 第二个参数必须是一个列表

ans <- DT[, as.data.table(do.call(rbind, function(x)
  if(length(x)>1) {
    combn(Materials, 2, simplify=FALSE)
  }
  else x)), 
  by=Order.number][,
  .N, by=.(V1, V2)]

你在 Materials 中有一些 NA 值吗?

否则你的代码对我有用

#generate some random data
X<-data.frame(Order.number=rep(letters[1:10],3), Materials=rep(letters[11:20],3))

library(data.table)
DT <- data.table(Order.number=X$Order.number, Materials=X$Materials)
setorder(DT, Order.number, Materials)

ans <- DT[, as.data.table(do.call(rbind, combn(Materials, 2, simplify=FALSE))), 
      by=Order.number][,
                       .N, by=.(V1, V2)]

很明显,您的 DT 中有一些分组变量 Order.number 的值,给出了一组长度为 1 或更小的组,因此 combn(Materials, 2...) 抱怨 n < m。

您可以使用 DT[, .N, by=Order.number] [N==1] 轻松诊断出哪个组的长度为 1。

然后要么从您的摘要中排除那些,要么为 combn 编写一个包装器,当输入长度 n < m 时不执行任何操作。

(可以说 combn 应该有一个增强的非默认选项来选择性地抑制错误,当应用于长度为 n < 2 的组时,当 运行 在分组时很可能发生df/dt)