2017-02-23 262 views
-1

У меня есть огромная таблица данных с миллионами строк и десятков столбцов, поэтому производительность для меня является важной проблемой. Данные описывают посещения сайта контента. Я хочу вычислить ContentId самого раннего (т. Е. Минимального времени хита) каждого посещения. То, что я сделал это: dt[,.(FirstContentOfVisit=ContentID[ContentID != ""][which.min(HitTime)]), by=VisitId,.SDcols=c("ContentID","HitTime")]Как фильтровать столбец на основе условия из другого столбца в R

проблема заключается в том, что я не знаю, если which.min первым вычисляет мин на всем векторе HitTime (который я не хочу!) Или делает это только на фильтрованную HitTime вектор (тот, который соответствует непустому ContentID).

Кроме того, после того, как я вычислил его - как я могу получить минимальное значение HitTime ContentID, отличное от первого (то есть самое раннее время попадания непервого идентификатора содержимого).

Когда я попытался выполнить оба действия с определенными пользователем функциями (сначала - отсортируйте таблицу подданных, а затем извлеките требуемое значение), потребовались возрасты (и на самом деле никогда не останавливались), хотя у меня очень сильная машина (виртуальная) с 180 ГБ оперативной памяти. Поэтому я ищу встроенное решение.

ответ

0

dplyr делает это намного проще. Вы не делились образцами своих данных, но я предполагаю, что интересующие переменные выглядят примерно так.

web <- tibble(
    HitTime = sample(seq(as.Date('2010/01/01'), as.Date('2017/02/23'), by="day"), 1000), 
    ContentID = 1:1000, 
    SessionID = sample(1:100, 1000, replace = TRUE) 
) 

Тогда вы можете просто использовать group_by и summarise найти самое раннее значение HitTime для каждого SessionID.

web %>% 
    group_by(SessionID) %>% 
    summarise(HitTime = min(HitTime))