r - 连续日值的总和

标签 r dataframe sum

与之前的question保持一致,假设我有一个数据集:

Date       rain code
2009-04-01  0.0 0 
2009-04-02  0.0 0 
2009-04-03  0.0 0 
2009-04-04  0.7 1 
2009-04-05 54.2 1  
2009-04-06  0.0 0 
2009-04-07  5.0 1 
2009-04-08  9.0 0 
2009-04-09  0.0 0 
2009-04-10  0.0 0 
2009-04-11  0.0 0 
2009-04-12  5.3 1  
2009-04-13 10.1 1  
2009-04-14  6.0 1  
2009-04-15  8.7 1  
2009-04-16  0.0 0 
2009-04-17  0.0 0 
2009-04-18  0.0 0 
2009-04-19  2.0 0 
2009-04-20  3.0 0 
2009-04-21  0.0 0 
2009-04-22  0.0 0 
2009-04-23  0.0 0 
2009-04-24  0.0 0 
2009-04-25  4.3 1  
2009-04-26 42.2 1  
2009-04-27 45.6 1  
2009-04-28 12.6 1  
2009-04-29  6.2 1  
2009-04-30  1.0 1  

DT = structure(list(Date = structure(c(14335, 14336, 14337, 14338, 
14339, 14340, 14341, 14342, 14343, 14344, 14345, 14346, 14347, 
14348, 14349, 14350, 14351, 14352, 14353, 14354, 14355, 14356, 
14357, 14358, 14359, 14360, 14361, 14362, 14363, 14364), class = "Date"), 
    rain = c(0, 0, 0, 0.7, 54.2, 0, 5, 9, 0, 0, 0, 5.3, 10.1, 
    6, 8.7, 0, 0, 0, 2, 3, 0, 0, 0, 0, 4.3, 42.2, 45.6, 12.6, 
    6.2, 1), code = c(0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 
    0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    1L, 1L, 1L, 1L, 1L)), .Names = c("Date", "rain", "code"), row.names = c(NA, 
-30L), class = "data.frame")

code为1时,我试图折叠数据集以获得rain连续值的总和。我需要在第二天之前获得它们的总和事件,包容性。例如,我想分别获取2009-04-13到2009-04-06和2009-04-07到2009-04-08的降雨值总和。因此,我试图找到方法来定义 code 何时等于 1 以及第二天(含)。最终产品应该如下所示:

Date       rain code
2009-04-01  0.0 0 
2009-04-02  0.0 0 
2009-04-03  0.0 0  
2009-04-06  54.9 1  
2009-04-08  14.0 1 
2009-04-09  0.0 0 
2009-04-10  0.0 0 
2009-04-11  0.0 0 
2009-04-16 30.1 1 
2009-04-17  0.0 0 
2009-04-18  0.0 0 
2009-04-19  2.0 0 
2009-04-20  3.0 0 
2009-04-21  0.0 0 
2009-04-22  0.0 0 
2009-04-23  0.0 0 
2009-04-24  0.0 0  
2009-04-30  111.9 1  (if last entry of data frame)

任何有关上述问题的帮助将不胜感激。

最佳答案

这是一种方法:

library(data.table)
setDT(DT)

res = DT[, .(
  Date = Date[.N], 
  rain = sum(rain),
  code = code[1L]
), by=.(g = cumsum(shift(!code, fill=FALSE)))]

res[, g := NULL]

          Date  rain code
 1: 2009-04-01   0.0    0
 2: 2009-04-02   0.0    0
 3: 2009-04-03   0.0    0
 4: 2009-04-06  54.9    1
 5: 2009-04-08  14.0    1
 6: 2009-04-09   0.0    0
 7: 2009-04-10   0.0    0
 8: 2009-04-11   0.0    0
 9: 2009-04-16  30.1    1
10: 2009-04-17   0.0    0
11: 2009-04-18   0.0    0
12: 2009-04-19   2.0    0
13: 2009-04-20   3.0    0
14: 2009-04-21   0.0    0
15: 2009-04-22   0.0    0
16: 2009-04-23   0.0    0
17: 2009-04-24   0.0    0
18: 2009-04-30 111.9    1

工作原理:

  • shift 正在从前一行获取值
  • 当像 !code 这样的逻辑值相加时,TRUE/FALSE 被视为 1/0
  • .Nby= 组中的最后一行

一般语法为 DT[, j, by],其中 j 是使用数据的每个 by 子集计算的。

关于r - 连续日值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38908841/

相关文章:

r - 将语言环境设置为系统默认 UTF-8

R对数据表的特殊 reshape

R 中具有自定义字段类的引用类?

python - 在 Python 中对选定的日期数据进行子集化

linux - 使用 shell 脚本的文件中的总值,其中值以 gb、mb、kb、b 为单位

python - 如何获取要打印的 CSV 列列表的总和

r - 使用嵌套列表时如何保留列表名称?

python - 将多行字符串转换为数据框

python - pyspark - 使用 OR 条件连接

python - 对数字列表求和,直到找到数字 X