2017-03-06 22 views
0

我正在尋找在每一行上運行累積總和的值,該值位於該點之前和之後的兩列中。所以在這種情況下,我在兩天內的每個給定分鐘都有兩種事件類型的量。我想創建一個列,該列按類型添加每行之前和之後發生的所有事件。 SUMIF從Excel想到的,但我不知道如何端口到R:在另一行中處理時間的條件求和

編輯:添加set.seed,更容易的數字

,我有以下數據集:

set.seed(42) 
master_min = 
    setDT(
    data.frame(master_min = seq(
     from=as.POSIXct("2016-1-1 0:00", tz="America/New_York"), 
     to=as.POSIXct("2016-1-2 23:00", tz="America/New_York"), 
     by="min" 
    )) 
) 
incident1= round(runif(2821, min=0, max=10)) 
incident2= round(runif(2821, min=0, max=10)) 

master_min = head(cbind(master_min, incident1, incident2), 5) 

如何計算基本以下邏輯:

的每一行,總之一切該行的時間戳之前發生的incident1s和所有的R之後所發生的incident2s ow的時間戳?獲得數據表解決方案,如果不是dplyr會很棒,因爲我正在處理大型數據集。下面是一個和之前的data`後:

BEFORE:

   master_min incident1 incident2 
    1: 2016-01-01 00:00:00   9   6 
    2: 2016-01-01 00:01:00   9   5 
    3: 2016-01-01 00:02:00   3   5 
    4: 2016-01-01 00:03:00   8   6 
    5: 2016-01-01 00:04:00   6   9 

經過計算:

   master_min incident1 incident2 new_column 
    1: 2016-01-01 00:00:00   9   6 25 
    2: 2016-01-01 00:01:00   9   5 29 
    3: 2016-01-01 00:02:00   3   5 33 
    4: 2016-01-01 00:03:00   8   6 30 
    5: 2016-01-01 00:04:00   6   9 29 
+1

請添加'set.seed'。另外,爲了創建一個最小的例子,不需要進行太多的觀察。最後,請提供您想要的輸出 - 除非您希望人們忽略這個問題或者在流行答案中暗暗刺中。 –

+0

添加了set.seed並在之前和之後顯示。更簡單的數字供快速參考。 – LoF10

回答

0

如果我理解正確:

# Cumsum of incident1, without current row: 
master_min$sum1 <- cumsum(master_min$incident1) - master_min$incident1 

# Reverse cumsum of incident2, without current row: 
master_min$sum2 <- rev(cumsum(rev(master_min$incident2))) - master_min$incident2 

# Your new column: 
master_min$new_column <- master_min$sum1 + master_min$sum2 
+0

不,這給了我一個向量(28,32,36,33,32, 35),與我正在尋找的列不同,基本上對於每一行,我需要該行之前的所有事件1的總和+該行之後的所有事件2的總和。 – LoF10

+0

@ LoF10這個解決方案是正確的,它只是你的數據只有5行,而他有6個。 –

+0

是的,我剛剛意識到,編輯我的問題。請諒解混淆 – LoF10

0

*更新

下面兩行可以做的工作

master_min$sum1 <- cumsum(master_min$incident1) 

master_min$sum2 <- sum(master_min$incident2) - cumsum(master_min$incident2) 

我改寫了這個問題有點展現出位更全面的結構

library(data.table) 

master_min <- 
    setDT(
    data.frame(master_min = seq(
     from=as.POSIXct("2016-1-1 0:00", tz="America/New_York"), 
     to=as.POSIXct("2016-1-1 0:09", tz="America/New_York"), 
     by="min" 
    )) 
) 
set.seed(2) 

incident1= as.integer(runif(10, min=0, max=10)) 
incident2= as.integer(runif(10, min=0, max=10)) 

master_min = cbind(master_min, incident1, incident2) 

現在master_min看起來像這樣

> master_min 
      master_min incident1 incident2 
1: 2016-01-01 00:00:00   1   5 
2: 2016-01-01 00:01:00   7   2 
3: 2016-01-01 00:02:00   5   7 
4: 2016-01-01 00:03:00   1   1 
5: 2016-01-01 00:04:00   9   4 
6: 2016-01-01 00:05:00   9   8 
7: 2016-01-01 00:06:00   1   9 
8: 2016-01-01 00:07:00   8   2 
9: 2016-01-01 00:08:00   4   4 
10: 2016-01-01 00:09:00   5   0  

應用轉換

master_min$sum1 <- cumsum(master_min$incident1) 

master_min$sum2 <- sum(master_min$incident2) - cumsum(master_min$incident2) 

結果

> master_min 
      master_min incident1 incident2 sum1 sum2 
1: 2016-01-01 00:00:00   1   5 1 37 
2: 2016-01-01 00:01:00   7   2 8 35 
3: 2016-01-01 00:02:00   5   7 13 28 
4: 2016-01-01 00:03:00   1   1 14 27 
5: 2016-01-01 00:04:00   9   4 23 23 
6: 2016-01-01 00:05:00   9   8 32 15 
7: 2016-01-01 00:06:00   1   9 33 6 
8: 2016-01-01 00:07:00   8   2 41 4 
9: 2016-01-01 00:08:00   4   4 45 0 
10: 2016-01-01 00:09:00   5   0 50 0 
+0

打算成爲一個答案,但我再次看了這個問題,似乎只有一半的答案。對於偶發事件2,他希望像一個反向cumsum和不同於事件1 – JPHwang

+0

嘿JP,這是接近,但不是我正在尋找。基本上對於每一行,我需要該行之前的所有事件1的總和+該行之後的所有事件2的總和。所以用你的set.seed(2),第一行沒有出現前面的事件1,所以thats(0 + sum(row1之後的所有incidient2s) – LoF10

相關問題