combn на сгруппированном ОУ возвращает ошибку n ‹m

У меня есть набор данных с 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

Это работает, если я просто использую случайную сгенерированную таблицу. Так могло ли это быть как-то связано с набором данных, который у меня есть?

РЕДАКТИРОВАТЬ: я пробовал с значением ошибки гребня, но получаю сообщение «Ошибка в 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)]

person M.A    schedule 23.05.2018    source источник
comment
Что length(Materials) возвращается?   -  person Rui Barradas    schedule 23.05.2018
comment
Вы имеете в виду длину (DT $ Materials)? Возвращает 31557   -  person M.A    schedule 23.05.2018
comment
Возможный дубликат значения ошибки combn: Ошибка в FUN ( X [[i]], ...): n ‹m в R   -  person CER    schedule 23.05.2018
comment
Никто не может помочь?   -  person M.A    schedule 23.05.2018
comment
В вашем if должно быть if(length(x)>1) { combn(x, 2, simplify=FALSE) }.   -  person Rui Barradas    schedule 24.05.2018
comment
По-прежнему не работает. Он говорит: Ошибка в do.call (rbind, function (x) if (length (x) ›1) {: второй аргумент должен быть списком   -  person M.A    schedule 24.05.2018
comment
Очевидно, у вас есть какое-то значение группирующей переменной Order.number в вашем DT, дающее группу длиной 1 или меньше, поэтому combn(Materials, 2...) жалуется, что n ‹m. Вы можете легко определить, какая группа имеет длину 1, с помощью DT[, .N, by=Order.number] [N==1]   -  person smci    schedule 24.05.2018
comment
Не стесняйтесь голосовать за ответы, которые сочли полезными   -  person smci    schedule 28.05.2018


Ответы (2)


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

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

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

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

person smci    schedule 24.05.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)]
person Esther    schedule 23.05.2018