Как удалить пустые столбцы в данных транзакции, прочитанных с помощью пакета arules?

У меня есть датасет, сделанный в формате корзины данных. Я прочитал этот набор данных в R, используя вызов пакета arules. который имеет встроенную функцию для чтения транзакций, поэтому я использовал ее и прочитал свой набор данных. Ниже приведен код, который я использовал:

trans = read.transactions("C:/Users/HARI/Desktop/Graph_mining/transactional_data_v3.csv", format = "basket", sep=",",rm.duplicates=TRUE)
inspect(trans[1:5])
  items                  
1 {,                     
   ANTIVERT,             
   SOFTCLIX}             
2 {,                     
   CEFADROXIL,           
   ESTROGEN}             
3 {,                     
   BENZAMYCIN,           
   BETAMETH,             
   KEFLEX,               
   PERCOCET}             
4 {,                     
   ACCUTANE(RXPAK;10X10),
   BENZAMYCIN}           
5 {,                     
   ALBUTEROL,            
   BUTISOLSODIUM,        
   CLARITIN,             
   NASACORTAQ}

Как видите, когда я использую inspect(trans), он показывает транзакции с пустым столбцом в каждой. Мой вопрос: как я могу удалить эти пустые столбцы?

Полный dput объекта trans можно найти по этой ссылке.


person Harish    schedule 23.03.2015    source источник
comment
Это пакеты, а не библиотеки. Пожалуйста, опубликуйте dput(trans)   -  person IRTFM    schedule 24.03.2015
comment
"14834", "14835", "14836"), class = "AsIs")), .Names = "itemsetID", row.names = c(NA, -14836L), class = "data.frame") ) Вот что я получаю после dput(trans)   -  person Harish    schedule 24.03.2015
comment
Ваш вывод усечен ... можете ли вы добавить его полностью в текст вашего вопроса?   -  person Dominic Comtois    schedule 24.03.2015
comment
dput не отображается полностью в моей rstudio, он показывает от 7000. Как я могу получить полный dput? @ДоминикКомтуа   -  person Harish    schedule 24.03.2015
comment
например, вы можете dput(head(trans, 20)) для 20 первых строк   -  person Dominic Comtois    schedule 24.03.2015
comment
можешь опубликовать trans@itemInfo ? Вероятно, у вас есть пустой элемент.   -  person Neal Fultz    schedule 24.03.2015
comment
@DominicComtois Я прикрепил dput(head(trans,20)) к телу   -  person Harish    schedule 24.03.2015
comment
@NealFultz Когда я использую trans@itemInfo, у него есть список из 3778 элементов.   -  person Harish    schedule 24.03.2015
comment
Что-то странное с текстом dput... обычно начинается с structure(list(..., не знаю, почему в данном случае это не так. И он выдает ошибки (в нем есть '...' и другие нарушения. Можете ли вы попробовать только с 5 строками? (dput(head(trans)))   -  person Dominic Comtois    schedule 24.03.2015
comment
Ниже @DominicComtois находится ссылка на весь файл dput drive.google. com/file/d/0BxE3rA3-6F8eOGdWaHlOR0ZEZXc/   -  person Harish    schedule 24.03.2015
comment
@Harish Хорошо, теперь я понял. У меня было бы несколько вопросов, но было бы лучше перейти в чат, если хотите... Не знаю, как это сделать, обычно мы получаем запрос после нескольких сообщений, но я еще не получил ни одного.   -  person Dominic Comtois    schedule 24.03.2015
comment
@Harish Кажется, нам нужно дождаться подсказки, чтобы сделать это. meta.stackexchange.com/questions/96247/   -  person Dominic Comtois    schedule 24.03.2015
comment
@DominicComtois, сэр, мы можем поболтать любым другим способом?   -  person Harish    schedule 24.03.2015
comment
@DominicComtois Сэр, на самом деле набор данных, который я сделал, имеет 14836 строк и 38 столбцов, но в dput он показывает 3778 строк и 6 столбцов после того, как я импортирую файл с помощью функции read.transaction из пакета arules.   -  person Harish    schedule 24.03.2015
comment
Да, вот что мне было любопытно, если бы вы могли поместить CSV вместо объекта транзакции на странице Google...   -  person Dominic Comtois    schedule 24.03.2015
comment
@DominicComtois Сэр, ниже приведена ссылка на CSV-файл drive.google .com/file/d/0BxE3rA3-6F8eSUJ3QXk0RjJZNUk/   -  person Harish    schedule 24.03.2015


Ответы (2)


Кажется, я нашел решение вашей проблемы. Я взял ваш CSV-файл, открыл его в Excel и заменил все пустые ячейки на NA. Затем я вставил все это в LibreOffice Calc и сохранил обратно в csv, указав, что для всех ячеек следует использовать двойные кавычки (как ни странно, Excel не будет делать этого, кроме как с макросом vba. Вместо этого вы можете прочитать файл непосредственно в LibreOffice). Однако в Excel замена пустых ячеек на NA займет вечность). Затем:

trans <- read.table("d:/downloads/transactional_data_2.csv", sep=",", stringsAsFactors = TRUE, na.strings="NA", header=TRUE)
trans2 <- as(trans, "transactions")
inspect(trans2[1:5])

РЕЗУЛЬТАТЫ

inspect(trans[1:5])

  items                      transactionID
1 {X1=SOFTCLIX,                           
   X2=ANTIVERT}                          1
2 {X1=ESTROGEN,                           
   X2=CEFADROXIL}                        2
3 {X1=KEFLEX,                             
   X2=BETAMETH,                           
   X3=PERCOCET,                           
   X4=BENZAMYCIN}                        3
4 {X1=BENZAMYCIN,                         
   X2=ACCUTANE(RXPAK;10X10)}             4
5 {X1=CLARITIN,                           
   X2=ALBUTEROL,                          
   X3=NASACORTAQ,                         
   X4=BUTISOLSODIUM}                     5

Я думаю, что это результаты, которые вы ищете...?

person Dominic Comtois    schedule 25.03.2015
comment
Кажется, в конце концов Нил нашел правильное решение... так что на этом я остановлюсь. - person Dominic Comtois; 27.03.2015
comment
Спасибо, сэр, за ответ, но мне нужны транзакции без X1 и X2. я имею в виду, что я хочу транзакцию таким образом 1 {SOFTCLIX, ANTIVERT}, и мне тоже не нужен идентификатор транзакции. заранее спасибо. - person Harish; 27.03.2015

Я не очень хорошо знаком с пакетом arules. Мое лучшее предположение - прочитать данные с помощью read.csv, а затем преобразовать в формат транзакции вместо использования предоставленного read.transactions:

tran2 <- read.csv("downloads/transactional_data.csv")
tran3 <- as(tran2, "transactions")

РЕДАКТИРОВАТЬ: я считаю, что пробелы в ваших данных считываются неправильно; кроме того, есть дубликаты, которые также следует отфильтровать. Это должно иметь дело с этим. Вам понадобится пакет reshape2.

trans2 <- read.csv("downloads/transactional_data.csv", na.strings="", stringsAsFactors=FALSE )
trans2$id <- seq(nrow(trans2))
t2.long <- melt(trans2, id.vars="id")
t2.long$variable <- NULL
t3 <- as(lapply(split(t2.long$value, t2.long$id), unique), "transactions")
person Neal Fultz    schedule 24.03.2015
comment
Это ошибка, которую я получаю, когда выполняю ваш код. Error: cannot allocate vector of size 2.0 Gb In addition: Warning messages: 1: In unique.default(.Internal(unlist(lapply(x, levels), recursive, : Reached total allocation of 2932Mb: see help(memory.size) 2: In unique.default(.Internal(unlist(lapply(x, levels), recursive, : Reached total allocation of 2932Mb: see help(memory.size) 3: In unique.default(.Internal(unlist(lapply(x, levels), recursive, : Reached total allocation of 2932Mb: see help(memory.size) - person Harish; 27.03.2015
comment
Я не получил эти сообщения об ошибках. Можете ли вы попробовать memory.limit(NA) перед повторным запуском? - person Dominic Comtois; 27.03.2015
comment
@DominicComtois Вот что я получаю, когда использую memory.limit(NA) [1] 2932 - person Harish; 29.03.2015