【问题标题】:Accumulated count for each element in a range范围内每个元素的累积计数
【发布时间】:2020-06-02 17:15:53
【问题描述】:

我有一张桌子 x,开始和结束是一天中的小时。

x = data.table(start=c(5,7,9,12), end=c(12,14,15,20), val = 7:10)

我希望输出表是:

从第 4 小时(不是 5 小时)到第 21 小时(不是 20 小时)的每个小时,都有累计值如:

hour total
4    0
5    7
6    7
7    15(7+8)

【问题讨论】:

  • 我不明白你的问题和你的例子。

标签: r dplyr data.table


【解决方案1】:

我对OP问题的理解是输入数据集x中的每一行都是一个有开始和结束的段。我们需要为总间隔中的每个值计算与包含小时的段相对应的值的总和。

dplyr/purrr 的一种可能解决方案:


library(dplyr)
## Create the data 
x = data.frame(start=c(5,7,9,12), end=c(12,14,15,20), val = as.double(7:10))
## Extract possible values
values <- seq(from=min(x$start), to=max(x$end))
## Function for one given hour
cumval <- function(hour){
    tibble(
        hour=hour, 
        total = x %>% mutate(tot=if_else( (hour>=start & hour<=end), val, 0)) %>% 
        pull(tot) %>% sum
        )
}
## Iterate
values %>% purrr::map_dfr(cumval)

输出是:

# A tibble: 16 x 2
    hour total
   <int> <dbl>
 1     5     7
 2     6     7
 3     7    15
 4     8    15
 5     9    24
 6    10    24
 7    11    24
 8    12    34
 9    13    27
10    14    27
11    15    19
12    16    10
13    17    10
14    18    10
15    19    10
16    20    10

【讨论】:

    【解决方案2】:

    这是一个简单的基本 R 解决方案:

    hour  <- min(x$start):max(x$end)
    total <- sapply(hour, function(i) sum(x$val[x$start <= i & x$end >= i])))
    data.frame(hour, total)
    #>    hour total
    #> 1     5     7
    #> 2     6     7
    #> 3     7    15
    #> 4     8    15
    #> 5     9    24
    #> 6    10    24
    #> 7    11    24
    #> 8    12    34
    #> 9    13    27
    #> 10   14    27
    #> 11   15    19
    #> 12   16    10
    #> 13   17    10
    #> 14   18    10
    #> 15   19    10
    #> 16   20    10
    
    

    【讨论】:

    • 比我的还简单!
    【解决方案3】:

    这是另一个data.table 选项,每小时使用by=.EACHI

    x[.(hr=max(0L, min(x)-1L):min(23L, max(end)+1L)),
        on=.(start<=hr, end>=hr), by=.EACHI, fcoalesce(sum(val), 0L)]
    

    输出:

        start end V1
     1:     4   4  0
     2:     5   5  7
     3:     6   6  7
     4:     7   7 15
     5:     8   8 15
     6:     9   9 24
     7:    10  10 24
     8:    11  11 24
     9:    12  12 34
    10:    13  13 27
    11:    14  14 27
    12:    15  15 19
    13:    16  16 10
    14:    17  17 10
    15:    18  18 10
    16:    19  19 10
    17:    20  20 10
    18:    21  21  0
    

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 2020-10-16
      • 1970-01-01
      • 2012-04-19
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      相关资源
      最近更新 更多