R (arules) Конвертировать данные в транзакции и удалить NA
У меня есть набор данных. Моя цель - преобразовать фрейм данных в данные транзакций, чтобы выполнить анализ корзины рынка с использованием пакета Arules в R. Я провел онлайн-исследование, касающееся конвертации фрейма данных в данные транзакций, например ( Как подготовить данные транзакций в корзину для arules) и ( Преобразование CSV в транзакции для Arules), но результат, который я получил, был другим.
dput (DF)
structure(list(Transaction_ID = c("A001", "A002", "A003", "A004", "A005", "A006"),
Fruits = c(NA, "Apple", "Orange", NA, "Pear", "Grape"),
Vegetables = c(NA, NA, NA, "Potato", NA, "Yam"),
Personal = c("ToothP", "ToothP", NA, "ToothB", "ToothB", NA),
Drink = c("Coff", NA, "Coff", "Milk", "Milk", "Coff"),
Other = c(NA, NA, NA, NA, "Promo", NA)),
.Names = c("Transaction_ID", "Fruits", "Vegetables", "Personal", "Drink", "Other"),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
Ниже моя структура данных
Transaction_ID Fruits Vegetables Personal Drink Other
A001 NA NA ToothP Coff NA
A002 Apple NA ToothP NA NA
A003 Orange NA NA Coff NA
A004 NA Potato ToothB Milk NA
A005 Pear NA ToothB Milk Promo
A006 Grape Yam NA Coff NA
класс для каждого столбца
sapply(df, class)
Transaction_ID Fruits Vegetables Personal Drink Other
"character" "character" "character" "character" "character" "character"
Преобразовать фрейм данных в данные транзакции
data <- as(split(df[,"Fruits"], df[,"Vegetables"],df[,"Personal"], df[,"Drink"], df[,"Other"]), "transactions")
inspect(data)
Результаты, которые я получил
[1] {NA,NA,ToothP,Coff,NA}
[2] {Apple,NA,ToothP,NA,NA}
[3] {Orange,NA,NA,Coff,NA}
[4] {NA,Potato,ToothB,Milk,NA}
[5] {Pear,NA,ToothB,Milk,Promo}
[6] {Grape,Yam,NA,Coff,NA}
Данные транзакции были успешно преобразованы, но мне было интересно, есть ли способ удалить элементы NA? поскольку НС будет рассматривать как элемент, если они все еще остаются в списке транзакций.
2 ответа
Огустари прав. Вот полный код, который также обрабатывает идентификаторы транзакций.
library("arules")
library("dplyr") ### for dbl_df
df <- structure(list(Transaction_ID = c("A001", "A002", "A003", "A004", "A005", "A006"),
Fruits = c(NA, "Apple", "Orange", NA, "Pear", "Grape"),
Vegetables = c(NA, NA, NA, "Potato", NA, "Yam"),
Personal = c("ToothP", "ToothP", NA, "ToothB", "ToothB", NA),
Drink = c("Coff", NA, "Coff", "Milk", "Milk", "Coff"),
Other = c(NA, NA, NA, NA, "Promo", NA)),
.Names = c("Transaction_ID", "Fruits", "Vegetables", "Personal", "Drink", "Other"),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
### remove transaction IDs
tid <- as.character(df[["Transaction_ID"]])
df <- df[,-1]
### make all columns factors
for(i in 1:ncol(df)) df[[i]] <- as.factor(df[[i]])
trans <- as(df, "transactions")
### set transactionIDs
transactionInfo(trans)[["transactionID"]] <- tid
inspect(trans)
items transactionID
[1] {Personal=ToothP,Drink=Coff} A001
[2] {Personal=ToothP} A002
[3] {Drink=Coff} A003
[4] {Vegetables=Potato,Personal=ToothB,Drink=Milk} A004
[5] {Personal=ToothB,Drink=Milk,Other=Promo} A005
[6] {Vegetables=Yam,Drink=Coff} A006
Я могу предложить вам это решение, но я не знаю, является ли это то, что вы ищете.
dput (DF)
df <- data.frame(structure(list(Transaction_ID = as.factor(c("A001", "A002", "A003", "A004", "A005", "A006")),
Fruits = as.factor(c(NA, "Apple", "Orange", NA, "Pear", "Grape")),
Vegetables = as.factor(c(NA, NA, NA, "Potato", NA, "Yam")),
Personal = as.factor(c("ToothP", "ToothP", NA, "ToothB", "ToothB", NA)),
Drink = as.factor(c("Coff", NA, "Coff", "Milk", "Milk", "Coff")),
Other = as.factor(c(NA, NA, NA, NA, "Promo", NA))),
.Names = c("Transaction_ID", "Fruits", "Vegetables", "Personal", "Drink", "Other"),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L)))
Класс для каждого столбца Обратите внимание, что все классы "фактор"
sapply(df, class)
Transaction_ID Fruits Vegetables Personal Drink Other
"factor" "factor" "factor" "factor" "factor" "factor"
Преобразовать фрейм данных в данные транзакции
data <- as(df, "transactions")
inspect(data)
Результат у меня есть
items transactionID
[1] {Transaction_ID=A001,
Personal=ToothP,
Drink=Coff} 1
[2] {Transaction_ID=A002,
Fruits=Apple,
Personal=ToothP} 2
[3] {Transaction_ID=A003,
Fruits=Orange,
Drink=Coff} 3
[4] {Transaction_ID=A004,
Vegetables=Potato,
Personal=ToothB,
Drink=Milk} 4
[5] {Transaction_ID=A005,
Fruits=Pear,
Personal=ToothB,
Drink=Milk,
Other=Promo} 5
[6] {Transaction_ID=A006,
Fruits=Grape,
Vegetables=Yam,
Drink=Coff} 6
Я нашел часть решения здесь преобразовать фрейм данных в r в транзакцию или itemMatrix. Более того, кажется, что ваша команда
data <- as(split(df[,"Fruits"], df[,"Vegetables"],df[,"Personal"], df[,"Drink"], df[,"Other"]), "transactions")
inspect(data)
работает только для data.frame, содержащего только два столбца.