我有关联时间段(实际上是开始日期和结束日期)和连续值的数据。 我想找到一种方法来对时间段内每天的第三个变量的值求和。
例如,此表:
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
...
以此类推。有没有办法做到这一点?也许在润滑的帮助下? 谢谢!
答案 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)