【问题标题】:How to remove empty columns in transaction data read with the arules package?如何删除使用 arules 包读取的交易数据中的空列?
【发布时间】:2015-03-23 22:09:03
【问题描述】:

我有一个以篮子数据格式制作的数据集。我已经使用包调用 arules 在 R 中读取了该数据集,该包调用具有用于读取事务的内置函数,因此我使用了它并读取了我的数据集。以下是我使用的代码:

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) 时,它会显示每个交易都有一个空列。我的问题是如何删除那些空列?

有关trans 对象的完整dput,请参阅this link

【问题讨论】:

  • 它们是包,而不是库。请发帖dput(trans)
  • "14834", "14835", "14836"), class = "AsIs")), .Names = "itemsetID", row.names = c(NA, -14836L), class = "data.frame") ) 这是我在dput(trans)之后得到的结果
  • 您的 dput 已被截断...您能否将其完全添加到您的问题正文中?
  • dput 在我的 rstudio 中没有显示完整,它从 7000 开始显示。我怎样才能获得完整的 dput? @DominicComtois
  • 例如,您可以dput(head(trans, 20)) 获取前 20 行

标签: r transactions arules


【解决方案1】:

我想我已经找到了解决您问题的方法。我拿了你的 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

我认为这就是您正在寻找的结果...?

【讨论】:

  • 看来尼尔最终找到了正确的解决方案......所以我就这样吧。
  • 谢谢先生的回答,但我需要没有 X1 和 X2 的交易。我的意思是我想要以这种方式进行交易1 {SOFTCLIX, ANTIVERT},我也不想要交易 ID。提前致谢。
【解决方案2】:

我对 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")

【讨论】:

  • 这是我在执行您的代码时遇到的错误。 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)
  • 我没有收到这些错误消息。你可以在再次运行之前尝试memory.limit(NA)吗?
  • @DominicComtois 这是我使用memory.limit(NA) [1] 2932时得到的结果@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 2019-06-19
  • 2016-02-28
  • 2020-11-01
相关资源
最近更新 更多