我有一个包含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)]
答案 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>