2016-02-18 2 views
0

Сегодня мой первый день на R - ваши советы пройдут долгий путь.R - подмножество DF с использованием() и()

Я пытаюсь создать агрегированный вид пользователей на основе деятельности по бронированию.

Извлечь уникальный CustID в таблице заказов. Создайте новый DF для клиента.

customer <- with(BookingsDF,data.frame(CustID=sort(unique(CustID)))) 

Добавить в каждую таблицу CustID в таблице клиентов количество транзакций, которые они совершили.

customer <- cbind(customer, NumberOrders = with(BookingsDF, 
    as.numeric (by (id, CustID, function(x) length(unique(x)))))) 

Это генерирует сообщение об ошибке

Ошибка в data.frame (..., check.names = FALSE): аргументы подразумевают отличающуюся количество строк: 373545, 391910

Это не имеет смысла - как два запроса могут выдавать разные длины? Учитывая, что первый запрос извлекает уникальный CustID, а второй запрос извлекает количество раз, когда каждый уникальный CustID забронировал.

спасибо.

ОКОНЧАТЕЛЬНЫЙ: Спасибо за помощь. Я обновил код до:

customer <- booked.dt[,{ 
    FirstPurchaseDate = .SD[which.min(CreatedDate)] 
    LastPurchaseDate = .SD[which.max(CreatedDate)] 
    NumberOrders = .N 
    TotalAmount = sum(Price) 
} , by = CustID] 

К сожалению, для этого потребовалось много времени. Поэтому мне пришлось выполнять манипуляции через SQL, а затем загружать агрегированные данные в R.

+2

Выход из 'by' будет« списком » – akrun

ответ

1

Существует много пакетов, которые предлагают решения этой проблемы; Я предпочитаю data.table. Основная идея заключается в разделении, вычислении и воссоединении. Объявите data.table, а затем подсчитайте количество строк для каждого уникального идентификатора клиента и сохраните его в customer.

В этом примере, попробуйте этот

library(data.table) 
bookings.DT <- data.table(BookingsDF) 
customer <- bookings.DT[,.N,by="CustID"] 

и вы должны увидеть таблицу CustID и N в customer. Это предполагает, что данные находятся в длинном формате. Если нет, см. reshape2

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