1

我有一个包含 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

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

编辑:我尝试了combn error 的含义,但得到“do.call(rbind, function(x) if (length(x) > 1) { : second argument must be a list”

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)]
4

2 回答 2

1

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

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

然后要么从你的摘要中排除那些,要么为combn编写一个包装器,当输入长度n < m时什么都不做。

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

于 2018-05-24T04:52:55.927 回答
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)]
于 2018-05-23T22:48:50.720 回答