2016-11-16 1 views
0

У меня есть следующая проблема (на самом деле это две проблемы): у меня есть csv-файл с транзакциями. Но все предметы, купленные с идентификатором transactionID, хранятся в нескольких строках одной ячейки.Несколько ячеек строки из csv в транзакционную матрицу

Похоже, что этот

TransactionID Items 

1234    Milk 
       Butter 
       Bread 

2345    Milk 
       Bread 

3456    Beer 
       Milk 

4567    Beer 
       Butter 

Как вы можете видеть, что не все элементы используются в каждой сделке.

Как мне импортировать данные в R как матрицу сделки, которая выглядит следующим

TransactionID Milk Butter Bread Beer 
1234    1  1   1  0 
2345    1  0   1  0 
3456    1  0   0  1 
4567    0  1   0  1 

Это может быть сделано в одном, элегантный шаг? После импорта я хочу проанализировать свои данные, используя пакет arules.

Заранее благодарен!

+1

В том числе изображения данных не очень помогают. См. [Как создать воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), чтобы включить всю необходимую информацию в сам вопрос. – MrFlick

+0

Пробовал исправлять читаемость. – AutoMiner

ответ

1

Это не одна строка и предполагает, что слова разделяются пробелом. Сначала я нахожу уникальные слова, а затем выполняю двойной цикл.

u <- unique(do.call('c', strsplit(df$items, ' '))) 
for (i in 1:nrow(df)) { 
    for (j in u) { 
    df[i, j] <- 1 * (j %in% strsplit(df$items[i], ' ')[[1]]) 
    } 
} 
0

спасибо @DirkNachbar! Твой подход сработал и определенно подтолкнул меня в правильном направлении. Необходима небольшая корректировка: слова были разделены разрывом.

Впоследствии я добавил матрицу к файлу и повторно привязал ее для арулов.

write(mat, file = "TransactionMatrix", sep = "\n") 
trans = read.transactions("TransactionMatrix", format = "basket", sep = "\n") 

Проблема с этим подходом - это время выполнения. Имея несколько десятков тысяч транзакций и несколько тысяч элементов, для вычисления матрицы требуется возраст.

Поскольку моя конечная цель была импортирована в формат матрицы транзакций arules, я в конечном итоге использовал другой подход и объединил все элементы в один большой список.

df <- read.csv("Transactions.csv", header = TRUE, sep = ";", dec = ",") 

MaxTransactions <- 0 
for (i in 1:length(df$items)) { 

    add <- length(strsplit(as.character(df$items[i]),'\n')[[1]]) 
    MaxTransactions <- MaxTransactions + add 
    } 

IDs <- rep(NA, MaxTransactions) 
ITEMs <- rep(NA, MaxTransactions) 

Position <- 0 

for (i in 1:length(df$items)) { 

    tempITEM <- c(strsplit(as.character(df$items[i]),'\n')[[1]]) 
    tempID <- rep(as.character(df$TransID[i]),length(tempITEM)) 

    for (j in 1:length(tempITEM)) { 
     IDs[Position+j] <- tempID[j] 
     ITEMs[Position+j] <- tempITEM[j] 
     } 
    Position <- Position + length(tempITEM) 
    } 

Это позволило мне принуждать к матрице arules' транзакции из формата «сделки» вместо формата «корзины».

a_df <- data.frame(ID = as.factor(IDs),ITEM = as.factor(ITEMs)) 

TransList <- split(a_df[,"ITEM"],a_df[,"ID"]) 
TransMat <- as(TransList, "transactions") 

Это хорошо сработало для меня.

Смежные вопросы