2016-09-30 4 views
2

У меня есть две таблицы в R, которые выглядят как следующее:Оптимизация данных. Таблицы в R?

DT.Purchase <- data.frame(ID = c(1,1,1,2,2,3,3,3,3,3,4,4,4,4), 
          CDS = c("0389","0389", "3298", "4545", "1282", "4545", 
            "0389","0389", "5685", "4545", "1282", "0389", 
            "1282", "1282") 
         Date = c("5/28/2016","5/26/2016","8/9/2016","2/2/2015", 
            "2/24/2015", "9/27/2015", "9/27/2015", "9/5/2015", 
            "3/3/2016", "4/9/2014", "5/1/2014", "5/4/2014", 
            "6/9/2014", "7/7/2014"), 
          JFK = c(T,F,F,F,T,T,F,F,T,F,T,T,T,F), 
          RFK = c(F,T,T,F,T,F,F,F,F,T,T,T,T,T), 
          RUG = c(T,F,T,F,T,F,F,F,F,T,F,F,T,T), 
          LPG = c(T,T,T,F,F,T,T,F,F,F,F,F,T,F)) 


DT.Purchase$Date <- as.Date(DT.Purchase$Date, format = "%m/%d/%Y") 
DT.Purchase  <- data.table(DT.Purchase) 
ID CDS  Date JFK RFK RUG LPG 
1 0389 5/28/2016 T F T T 
1 0389 5/26/2016 F T F T 
1 3298 8/9/2016 F T T T 
2 4545 2/2/2015 F F F F 
2 1282 2/24/2015 T T T F 
3 4545 9/27/2015 T F F T 
3 0389 9/27/2015 F F F T 
3 0389 9/5/2015 F F F F 
3 5685 3/3/2016 T F F F 
3 4545 4/9/2014 F T T F 
4 1282 5/1/2014 T T F F 
4 0389 5/4/2014 T T F F 
4 1282 6/9/2014 T T T T 
4 1282 7/7/2014 F T T F 

DT.Stay <- data.frame(Stay.ID = c(1,2,3,5,6,9,10,11), 
          ID = c(1,1,2,3,3,3,4,4), 
        Start.Date = c('5/26/2016','8/1/2016', '2/1/2015', '3/1/2016', 
            '9/1/2015', '4/9/2014', '4/7/2014','6/1/2014'), 
        End.Date = c('6/6/2016','9/1/2016','3/1/2015','3/7/2016', 
            '9/30/2015','4/14/2014','5/9/2014','7/11/2014')) 
DT.Stay$Start.Date <- as.Date(DT.Stay$Start.Date, format = "%m/%d/%Y") 
DT.Stay$End.Date <- as.Date(DT.Stay$End.Date, format = "%m/%d/%Y") 

DT.Stay <- data.table(DT.Stay) 

Stay.ID ID Start.Date End.Date 
1 1 5/26/2016 6/6/2016 
2 1 8/1/2016 9/1/2016 
3 2 2/1/2015 3/1/2015 
5 3 3/1/2016 3/7/2016 
6 3 9/1/2015 9/30/2015 
9 3 4/9/2014 4/14/2014 
10 4 4/7/2014 5/9/2014 
11 4 6/1/2014 7/11/2014 

Теперь в действительности, DT.Purchase гораздо больше (10 млн наблюдений) и DT.Stay составляет более 50000 наблюдений. Имеются весы для DT.Purchase[ ,.(JFK, RFK, DUG, LPG)], что равно c.weights = c(1,2,1,3). Эти веса представляют собой собственный вес, который мы рассматриваем. Целью этого является определение закупочных сделок на основе предыдущих покупок и весов. То, что я хотел бы сделать, это определить предыдущий cost.index, который является суммой всех предыдущих покупок на основе весов и предыдущих для каждого End.Date для каждого Stay.ID. Таким образом, окончательный data.table должен выглядеть

Stay.ID cost.index 
1  10 
2  16 
3  4 
5  11 
6  10 
9  3 
10  6 
11  10 

так, как я сделал это предполагает объединение в соответствии с ID (allow.cartesian = TRUE) двух наборов данных и проверки, чтобы увидеть, если Date <= End.Date. Затем я подставляю весы и sum для каждого Stay.ID. Это работает, но я ищу более быстрый способ сделать это. С 10 миллионами и 50000 наблюдениями слияние становится временем и ресурсом.

+4

Пожалуйста, покажите свой код, и предоставляете наборы данных в загружаемом формате – HubertL

+0

Кстати, вы будете иметь трудное время, делая вещи, эффективно используя суррогатное хранение форматы. R поддерживает класс 'Date' и' logical' (с значениями TRUE и FALSE). – Frank

ответ

5

С последней версией разви (1.9.7+), как это чему-л будет работать:

DT.Purchase[DT.Stay, on = .(ID = ID, Date >= Start.Date, Date <= End.Date), 
      .(Stay.ID, sum(as.matrix(.SD) %*% c.weights)), 
      by = .EACHI, .SDcols = JFK:LPG] 

Предполагая, что ваши даты в любом формате Date или IDate.

В 1.9.6 вы можете использовать вместо foverlaps:

foverlaps(setkey(DT.Purchase[, Date2 := Date], ID, Date, Date2), 
      setkey(DT.Stay, ID, Start.Date, End.Date))[, 
    sum(as.matrix(.SD) %*% c.weights), keyby = Stay.ID, .SDcols = JFK:LPG] 
+0

У меня нет доступа к 1.9.7, потому что вам нужно скачать его из github. Вы знаете какие-либо решения 1.9.6? – akash87

+0

@ akash87 добавил ответ 1.9.6 (который потеряет первоначальный порядок, поэтому, если вам это нужно - вам нужно будет добавить отдельный индекс для его восстановления) – eddi

+0

@ akash87 вы прочитали [инструкции по установке] (https://github.com/Rdatatable/data.table/wiki/Installation)? Devel, находящийся на GitHub, не должен быть препятствием _per se_ – MichaelChirico

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