组合 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)
我有一个包含 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,它就可以工作。那会不会和我的数据集有关?
编辑:我尝试使用
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)