2013-06-17 29 views
5

Tôi muốn tạo đối tượng giao dịch ở định dạng giỏ mà tôi có thể gọi bất kỳ lúc nào để phân tích. Dữ liệu chứa các mục được phân cách bằng dấu phẩy với 1001 giao dịch. 10 giao dịch đầu tiên trông như thế này:Phân tích liên kết với các giao dịch trùng lặp sử dụng gói arules trong R

hering,corned_b,olives,ham,turkey,bourbon,ice_crea 
baguette,soda,hering,cracker,heineken,olives,corned_b 
avocado,cracker,artichok,heineken,ham,turkey,sardines 
olives,bourbon,coke,turkey,ice_crea,ham,peppers 
hering,corned_b,apples,olives,steak,avocado,turkey 
sardines,heineken,chicken,coke,ice_crea,peppers,ham 
olives,bourbon,coke,turkey,ice_crea,heineken,apples 
corned_b,peppers,bourbon,cracker,chicken,ice_crea,baguette 
soda,olives,bourbon,cracker,heineken,peppers,baguette 
corned_b,peppers,bourbon,cracker,chicken,bordeaux,hering 
... 

tôi quan sát thấy rằng có được nhân đôi các giao dịch trong các dữ liệu và loại bỏ chúng nhưng mỗi lần tôi cố gắng đọc các giao dịch, tôi nhận được:

Lỗi trong asMethod (object): không thể ép buộc danh sách với các giao dịch với mục trùng lặp

đây là mã của tôi:

data <- read.csv("AssociationsItemList.txt",header=F) 
data <- data[!duplicated(data),] 
pop <- NULL 
for(i in 1:length(data)){ 
pop <- paste(pop, data[i],sep="\n") 
} 
write(pop, file = "Trans", sep = ",") 
transdata <- read.transactions("Trans", format = "basket", sep=",") 

tôi chắc chắn rằng thứ ere là một cái gì đó ít quan trọng nhưng tôi đã bỏ lỡ. Vui lòng cung cấp hỗ trợ của bạn.

+0

Xin lỗi, bạn đang viết dưới dạng csv có vẻ như (hoặc đã đóng) bạn đã thử đọc.csv hoặc read.table ở cuối? –

+0

cách tệp giao dịch trên được tạo mà không có cột tiêu đề – Pallavi

Trả lời

15

Vấn đề không phải với giao dịch trùng lặp (cùng hàng xuất hiện hai lần) nhưng mục trùng lặp (cùng một mục xuất hiện hai lần, trong cùng một giao dịch - ví dụ: "ô liu" trên dòng 4).

read.transactions có một đối số rm.duplicates để xóa các mục trùng lặp đó.

read.transactions("Trans", format = "basket", sep=",", rm.duplicates=TRUE) 
+2

Bạn có thể giải thích lý do tại sao các mục trùng lặp trong cùng một giao dịch không được phép? Điều gì sẽ xảy ra nếu ví dụ bạn muốn chứng minh rằng bạn đã mua gấp đôi lượng ô-liu thông thường? Ví dụ, trong dữ liệu giao dịch của tôi, có một cột số lượng và tôi không chắc chắn về cách tính toán – Blou91

1

Vincent Zoonekynd là đúng, vấn đề là do các mục bị trùng lặp trong giao dịch. Ở đây tôi có thể giải thích lý do tại sao arules yêu cầu các giao dịch không có các mục trùng lặp.

  • Các dữ liệu của transactions là cửa hàng nội bộ như một đối tượng ngCMatrix. mã nguồn có liên quan:

    setClass("itemMatrix", 
        representation(
        data  = "ngCMatrix", 
    ... 
    setClass("transactions", 
        contains = "itemMatrix", 
    ... 
    
  • ngCMatrix là một ma trận thưa thớt quy định tại Matrix gói. Đó là mô tả từ tài liệu chính thức:

    Lớp nsparseMatrix là một lớp ảo của thưa thớt “mẫu” ma trận, ví dụ: ma trận nhị phân khái niệm với TRUE mục/FALSE. Chỉ vị trí của các yếu tố đó là TRUE được lưu trữ

Dường ngCMatirx tình trạng lưu trữ của một phần tử của một chỉ số nhị phân. Có nghĩa là đối tượng transactions trong arules chỉ có thể lưu trữ tồn tại/không tồn tại cho đối tượng giao dịch và không thể ghi số lượng. Vì vậy ...

0

Tôi vừa sử dụng chức năng 'duy nhất' để xóa các từ khóa trùng lặp. Dữ liệu của tôi hơi khác một chút vì tôi có một khung dữ liệu (dữ liệu quá lớn đối với CSV) và tôi có 2 cột: product_id và transaction_id. Tôi biết đó không phải là câu hỏi cụ thể của bạn, nhưng tôi phải làm điều này để tạo tập dữ liệu giao dịch và áp dụng các quy tắc kết hợp.

data # > 1 Million Transactions 
data <- unique(data[ , 1:2 ]) 
trans <- as(split(data[,"product_id"], data[,"trans_id"]),"transactions") 
rules <- apriori(trans, parameter = list(supp = 0.001, conf = 0.2)) 
Các vấn đề liên quan