2013-06-05 1 views
1

Должен быть простой и элегантный способ сделать это в R с пакетом data.table, но мне трудно понять его. Векторизованные операции предпочтительнее.R: группировать и подсчитывать строки, соответствующие условию, группе по уникальным значениям и таблице преобразования

library(data.table)  
d1 <- as.Date("01-13-2013", '%m-%d-%Y')  
d2 <- as.Date("12-31-2013", '%m-%d-%Y')  
data <- data.frame(Date=sample(seq(d1,d2,1),10), Customer_ID=sample(1:5,20,replace=T), Product=sample(letters[1:5]), Store=sample(c("S1","S2"))) 

создать

ID Date_Prod_A Times_Purchased_A Date_Prod_C Times_Purchased_C

1 47 01-01-2012     2   -     - 

2 26   -     - 01-17-2012     1 

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


< таблица -data.table (данные)

+0

Извините, откуда товар product_C? это, возможно, проблема форматирования с вашим текстом? –

+2

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

ответ

3

Я думаю, что вы имеете в виду, сколько раз появляется продукт, а не сколько различных продуктов, для каждого ID.

Здесь решение с использованием data.table и reshape, но в 2 этапа: сначала я вычисляю количество продуктов в длинном формате, а затем преобразую свои данные в широкий. Я думаю, что использование plyr и ddply здесь лучше.

library(data.table) 
DT <- as.data.table(dat1) 
DT[,n := .N,by= ID] 
reshape(DT,direction='wide',idvar='ID',timevar='Product',drop='Store') 
    ID Purchase_date.Product_A n.Product_A Purchase_date.Product_C n.Product_C 
1: 47    01-01-2012   2      NA   NA 
2: 26      NA   NA    01-17-2012   1 
+0

Да, это похоже на то, что мне нужно, спасибо! – mel

+3

@DeanMacGregor Вы сбиваете с толку устаревший пакет reshape (обновляется с помощью reshape2) и команду reshape, которую я использую здесь – agstudy

+1

@agstudy Я не знал, что в пакете 'reshape2' была команда' reshape'. Я всегда просто использую 'melt' и' cast' –

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