Комбинированный сгруппированный DT возвращает ошибку "n <m" - PullRequest
0 голосов
/ 23 мая 2018

У меня есть набор данных с 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) {: второй аргумент должен быть списком "

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 голосов
/ 24 мая 2018

Очевидно, что у вас есть некоторое значение групповой переменной Order.number в вашем DT, дающее группу длиной 1 или меньше, следовательно, combn(Materials, 2...) жалуется, что n

Вы можете легко диагностировать, какая группа имеет длину 1, с помощью DT[, .N, by=Order.number] [N==1].

Затем либо исключить их из вашего резюме, либо написать оболочку для combn, которая ничего не делает, когда длина ввода n

(Возможно, combn должен иметь расширенную опцию не по умолчанию, чтобы выборочно подавлять ошибку при применении к группам длины n <2, что, вероятно, происходит при запуске на сгруппированных df / dt)</p>

0 голосов
/ 24 мая 2018

Есть ли у вас некоторые значения 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...