组合DT上的组合返回错误“n< m”

时间:2018-05-23 18:35:08

标签: r dataframe data.table correlation combn

我有一个包含31557个观测值的数据集,以及变量Order.number和Materials。我试图在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

中收到错误

如果我只使用随机生成的表,它可以工作。那么它可能与我拥有的数据集有关吗?

编辑:我试过meaning of combn error但是得到了“do.call中的错误(rbind,function(x)if(length(x)&gt; 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)]

2 个答案:

答案 0 :(得分:0)

材料中是否有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)]

答案 1 :(得分:0)

显然,您在DT中对变量Order.number进行分组有一定的价值,给出一组长度为1或更短的组,因此combn(Materials, 2...)会抱怨n&lt;米

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

然后从你的摘要中排除那些,或者在输入长度n <1时为combn编写一个什么也不做的包装器。米。

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