R: априорная ошибка из-за невозможности принудить NA к nsparseMatrix

Я экспериментирую с априорным алгоритмом в пакете arules.

Вот что я сделал: я загрузил представление из SQL Server в R. Поскольку эти данные не в форме транзакций (для использования в априори), мне пришлось преобразовать их:

данные ‹- sapply(заказы, as.factor)

Затем я ввел априорную функцию:

априори (данные, параметр = список (поддержка = 0,005, достоверность = 0,5))

Я получаю эту ошибку:

Ошибка в t(as(from, "ngCMatrix")): ошибка в оценке аргумента "x" при выборе метода для функции "t": Ошибка в asMethod(object): невозможно принудить "NA" к "nsparseMatrix"

Я проверил запрос, и у меня даже нет атрибута NULL/NA.

Я не понимаю, что означает ошибка. Кто-нибудь знает, в чем проблема и как это решить?


person Kim    schedule 19.12.2014    source источник
comment
Возможно, некоторые значения преобразуются во время apriori() в какую-то форму, например целочисленную или двойную, таким образом создавая NA, где вы не найдете их раньше? Вы пробовали sum(is.na(data)) и что вышло?   -  person Gullydwarf    schedule 19.12.2014
comment
@Gullydwarf Спасибо. К сожалению, он также дает 0 в качестве вывода.   -  person Kim    schedule 19.12.2014
comment
Это хорошо :) и sum(!is.finite(data))?   -  person Gullydwarf    schedule 19.12.2014
comment
@Gullydwarf О, ха-ха, я нуб. Хорошо, результат 88393256. Между прочим, данные содержат более 12 миллионов записей. Что это значит? Что 88393256 из 12 миллионов не конечны?   -  person Kim    schedule 19.12.2014
comment
Извините, я должен был быть более четким в отношении этой команды. Когда я понял, что утаиваю информацию, я не мог изменить свой комментарий. is.finite() возвращает True для чисел и False для символов, NULL, NA, NaN, 'Inf'. Вероятно, вы прочитали свои данные, но они все еще в символьном формате. Если ваши данные должны быть числовыми, попробуйте еще раз с sum(!is.finite(as.numerical(data))). Это скажет вам, сколько полей содержат не числа   -  person Gullydwarf    schedule 19.12.2014
comment
@Gullydwarf Спасибо за объяснение! Ну, данные состоят из большого количества nvarchar и некоторых атрибутов int. Набор данных похож на таблицу продаж с названиями продуктов и т. д. (следует указать это в вопросе). И is.character действительно дает TRUE. Разве для априорной функции невозможно обработать набор данных в символьном формате?   -  person Kim    schedule 19.12.2014
comment
@Gullydwarf Я понял, что столбцы только с числами вызывают ошибку (вообще не было NA). Несмотря на то, что когда я использую typeof() для тех столбцов только с числами, он говорит character (потому что я использовал as.factor, чтобы изменить его). Когда я опускаю эти столбцы, мне не нужно сначала использовать as.factor, и априорная функция работает нормально. В других наборах данных с числами это уже работает, но мне не нужно было использовать as.factor для этих наборов данных, поэтому я думаю, что это как-то связано. Вы знаете, как я могу включить столбцы с числами в любом случае?   -  person Kim    schedule 23.12.2014
comment
Итак, почему вы используете as.factor() в первую очередь? :)   -  person Gullydwarf    schedule 24.12.2014
comment
@Gullydwarf Потому что, если бы я не заставлял их учитывать фактор, я бы получил эту ошибку при использовании априорной функции: Error in asMethod(object) : column(s) 1, 5 not logical or a factor. Use as.factor or categorize first   -  person Kim    schedule 24.12.2014


Ответы (2)


Недавно я столкнулся с такой же ошибкой. Все, что я узнал, это то, что ваши данные должны быть принуждены к транзакциям для извлечения наборов элементов или правил. Этот фрагмент кода должен быть полезен.

transaction_data<- as(data, "transactions")
rules <- apriori(transaction_data,parameter = list(minlen=2,supp=0.2,conf=0.5))
person Eva    schedule 22.01.2015
comment
Я получил ту же ошибку, что и выше, делая то, что вы предложили. Но сработало то, что сегментировал, предложил поместить значения в data.frame. Итак, что сработало для меня: data = data.frame(as(data, transaction)); правила = априори (данные) - person Codious-JR; 09.11.2015

Основная проблема возникает, когда вы пытаетесь использовать R функции группировки. Как видите, здесь большинство функций группировки не возвращают вам обратно data.frame. В вашем случае вы использовали sapply, который возвращает вектор назад. Убедитесь, что вы позаботились о соответствующих преобразованиях:

data = data.frame(sapply(orders,as.factor))

А затем следуйте построению правил ассоциации:

apriori(data, parameter = list (support=0.005, confidence=0.5))

Это работает так, как ожидалось (проверено).

person Segmented    schedule 25.10.2015