簡體   English   中英

R:計算data.table中行之間的差異

[英]R: Calculate differences between rows in data.table

RProf透露,我執行的以下操作相當慢:

stockHistory[.(p), stock:=stockHistory[.(p), stock] - (backorderedDemands[.(p-1),backlog] - backorderedDemands[.(p),backlog])]

我想這是因為減法

backorderedDemands[.(p-1),backlog] - backorderedDemands[.(p),backlog]

有什么辦法可以加快此操作?

。(p)子集為p期間的data.table,。(p-1)子集為上一個周期的子集(請參見下面的示例數據)。 在這里應用某種diff()可能會更快嗎? 不過,我不知道該怎么做。

示例數據:

backorderedDemands<-CJ(period=1:1000, articleID=letters[1:10], backlog=0)[,backlog:=round(runif(10000)*42,0)]
setkey(backorderedDemands,period, articleID)
stockHistory<-CJ(period=1:1000, articleID=letters[1:10], stock=0)[,stock:=round(runif(10000)*42+66,0)]
setkey(stockHistory,period, articleID)

您可以首先在backorderedDemands計算差異列。

backorderedDemands[, diff := c(NA, -diff(backlog)), by=articleID]

另外,也不必使用stockHistory[.(p), stock] 僅使用stock就足夠了。

stockHistoryNew[.(p), stock:=stock - backorderedDemands[.(p), diff]]

如果您要計算數據的第一個差異,可以按以下方式進行操作。 快速...我包括了逐步計算。

library(data.table)
library(dplyr)

數據

set.seed(1)

backorderedDemands <- 
    CJ(period = 1:1000, 
       articleID = letters[1:10], 
       backlog = 0)[,backlog:= round(runif(10000) * 42, 0)]

stockHistory <- 
    CJ(period = 1:1000, 
       articleID = letters[1:10], 
       stock = 0)[, stock:= round(runif(10000) * 42 + 66, 0)]

    merge(stockHistory, backorderedDemands, 
      by = c("period", "articleID")) %>% 
    group_by(articleID) %>%
    mutate(lag_backlog = lag(backlog, 1),
           my_backlog_diff = backlog - lag_backlog,
           my_diff = stock + my_backlog_diff) %>% 
    as.data.frame(.) %>% 
    head(., 20)

   period articleID stock backlog lag_backlog my_backlog_diff my_diff
1       1         a    69      11          NA              NA      NA
2       1         b    94      16          NA              NA      NA
3       1         c    97      24          NA              NA      NA
4       1         d    71      38          NA              NA      NA
5       1         e    68       8          NA              NA      NA
6       1         f    71      38          NA              NA      NA
7       1         g   103      40          NA              NA      NA
8       1         h   101      28          NA              NA      NA
9       1         i   102      26          NA              NA      NA
10      1         j    67       3          NA              NA      NA
11      2         a    71       9          11              -2      69
12      2         b    89       7          16              -9      80
13      2         c    71      29          24               5      76
14      2         d    96      16          38             -22      74
15      2         e    96      32           8              24     120
16      2         f    99      21          38             -17      82
17      2         g    92      30          40             -10      82
18      2         h    87      42          28              14     101
19      2         i    85      16          26             -10      75
20      2         j    67      33           3              30      97

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM