Подготовка данных к правилам связи в R - фрейм данных для транзакции - PullRequest
0 голосов
/ 31 октября 2019

Мои данные взяты из базы данных SQL и представлены в виде таблицы, в которой у меня есть несколько строк для одной транзакции. Вместо того, чтобы просто использовать поле «product», я хочу использовать все остальные столбцы во фрейме данных.

Мои данные соответствуют приведенным ниже:

transID <- c('1','1','2','3')
state <- c('TX','TX','CA','MA')
product <- c('Oranges','Banana','Fish','Cheese')
Month <- c('January','January','Febuary','March')
Place <- c('A','A','B','C')

transactions <- data.frame(transID,state,product,Month,Place)

transactions
  transID state product   Month Place
1       1    TX Oranges January     A
2       1    TX  Banana January     A
3       2    CA    Fish Febuary     B
4       3    MA  Cheese   March     C

В идеале мои данные должны выглядетьследующим образом:

1 (TX,Oranges,Banana,January,A)
2 (CA,Fish,Febuary,B)
3 (MA, Cheese, March,C)

Каков наилучший способ перевести данные такого рода в формат транзакций?

Я пробовал следующее, но я просто объединяю строки 1 и 2 вместекак одна транзакция:

transactionData <- ddply(transactions,c("transID"),
                         function(df1) paste(df1$state,
                                             df1$product,
                                             df1$Month,
                                             df1$Place,
                                             collapse = ","))

Ответы [ 3 ]

1 голос
/ 01 ноября 2019

Это немного неудобно, поскольку data.frames хранит факторы.

library("arules")

# make all columns into items
df <- data.frame(
  id = transactions$transID, 
  items = factor(c(as.character(transactions$state),
    as.character(transactions$product), 
    as.character(transactions$Month), 
    as.character(transactions$Place))))

# remove duplicated state, month and place enties
df <- df[!duplicated(df),]

# this is from the manual page '? transactions'
trans <- as(split(df[,"items"], df[,"id"]), "transactions")    
inspect(trans)


    items                         transactionID
[1] {A,Banana,January,Oranges,TX} 1            
[2] {B,CA,Febuary,Fish}           2            
[3] {C,Cheese,MA,March}           3    

Надеюсь, это поможет.

0 голосов
/ 31 октября 2019

Вот базовое решение:

stack(tapply(transactions[, -1], 
       transactions[, 1, drop = F],
       FUN = function(DF) {
         paste(unique(unlist(DF), use.names = F), collapse = ',')
       }))[, 2:1]

#  ind                      values
#1   1 TX,Oranges,Banana,January,A
#2   2           CA,Fish,Febuary,B
#3   3           MA,Cheese,March,C

Основная часть - это часть tapply(), которая разбивается на transID, а затем выводит список остальных data.frame и сохраняет только уникальные значения. Вот результат только вызова tapply().

                            1                             2                             3 
"TX,Oranges,Banana,January,A"           "CA,Fish,Febuary,B"           "MA,Cheese,March,C" 

stack() и [, 2:1] являются чисто косметическими для получения хорошего data.frame, который упорядоченно заказан.

0 голосов
/ 31 октября 2019

А как насчет изменение формы , как это?

reshape(transactions,v.names = "product",timevar = "product",idvar = "state", direction = "wide")

transID state   Month Place product.Oranges product.Banana product.Fish product.Cheese
1       1    TX January     A         Oranges         Banana         <NA>           <NA>
3       2    CA Febuary     B            <NA>           <NA>         Fish           <NA>
4       3    MA   March     C            <NA>           <NA>         <NA>         Cheese
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...