有没有一种方法可以按日期和时间段汇总数据分组?

时间:2020-04-23 11:52:03

标签: r

我有关联时间段(实际上是开始日期和结束日期)和连续值的数据。 我想找到一种方法来对时间段内每天的第三个变量的值求和。

例如,此表:

       START        END NUMBER
1  2020-03-16 2020-05-31      5
2  2020-03-16 2020-06-30      7
3  2020-03-17 2020-08-31      1

具有一个新表:

DAY        SUM
2020-03-16    12
2020-03-17    13
2020-03-18    13
...
2020-05-31    13
2020-06-01    8
...

以此类推。有没有办法做到这一点?也许在润滑的帮助下? 谢谢!

3 个答案:

答案 0 :(得分:3)

尝试:

library(data.table)

setDT(df)[, c('START', 'END') := lapply(.SD, function(x) as.Date(as.character(x))), .SDcols = 1:2][
  , .(DAY = seq(START, END, by = 'day'), NUMBER = NUMBER), by = 1:nrow(df)][
    , .(SUM = sum(NUMBER)), by = DAY]

输出:

            DAY SUM
  1: 2020-03-16  12
  2: 2020-03-17  13
  3: 2020-03-18  13
  4: 2020-03-19  13
  5: 2020-03-20  13
 ---               
165: 2020-08-27   1
166: 2020-08-28   1
167: 2020-08-29   1
168: 2020-08-30   1
169: 2020-08-31   1

答案 1 :(得分:1)

另一个使用非等额联接的current选项:

null

输出:

data.table

数据:

ans <- DT[.(DATE=seq(min(START), max(END), by="1 day")), on=.(START<=DATE, END>=DATE), 
    by=.EACHI, .(SUM=sum(NUMBER))][, (1L) := NULL][]
setnames(ans, "END", "DAY")[]

答案 2 :(得分:0)

1)基数R 使用结尾处“注释”中可重复显示的数据,在erach行上方套用seq将日期范围扩展为日期序列。这样就给出了一个列表,其中每个输入行都有一个组件,我们将那些组件一起加在一起得到long。然后通过long汇总Date。不使用任何软件包。

expand <- function(i, data) with(data[i, ], 
  data.frame(Date = seq(START, END, "day"), NUMBER)
)

long <- do.call("rbind", lapply(1:nrow(DF), expand, data = DF))
result <- aggregate(NUMBER ~ Date, long, sum)

head(result)

给予:

        Date NUMBER
1 2020-03-16     12
2 2020-03-17     13
3 2020-03-18     13
4 2020-03-19     13
5 2020-03-20     13
6 2020-03-21     13

2)dplyr 展开rowwise代码中的每一行,然后在NUMBER代码中的Date上加上group_by

library(dplyr)

DF %>%
  rowwise %>%
  do(data.frame(Date = seq(.$START, .$END, "day"), NUMBER = .$NUMBER)) %>%
  ungroup %>%
  group_by(Date) %>%
  summarize(NUMBER = sum(NUMBER)) %>%
  ungroup

注意

Lines <- "       START        END NUMBER
1  2020-03-16 2020-05-31      5
2  2020-03-16 2020-06-30      7
3  2020-03-17 2020-08-31      1"
DF <- read.table(text = Lines)
DF[1:2] <- lapply(DF[1:2], as.Date)