R语言 从另一个数据计算2个日期之间的值的总和.框架?

62lalag4  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(123)

我有两个 Dataframe 。我想计算'date'的每一行中的日期之间(之间或类似>= <=)的数据中所有值的总和

data=data.frame(dat1=c('2021-01-01', '2021-01-02', 
                   '2021-01-04', '2021-01-10','2021-02-01', 
  '2021-02-19', 
                   '2021-02-20', '2021-05-10','2021-05-15', '2021-05-30', 
                   '2021-06-04', '2021-06-10','2021-06-11', '2021-06-12', 
                   '2021-06-13', '2021-06-14',"2021-06-15"), 
            values=c(34,56,78,32,2,3,5,4,6,9,8,7,1,2,5,4,7) )

   date=data.frame(dat1=c('2021-01-01', '2021-04-05', 
                   '2021-06-04', '2021-06-10'), 
            dat2=c('2021-01-10', '2021-04-16', 
                   '2021-06-09', '2021-06-20'))

期望输出:

date
     dat1       dat2           res
   1 2021-01-01 2021-01-10    200
   2 2021-04-05 2021-04-16     NA
   3 2021-06-04 2021-06-09     8
   4 2021-06-10 2021-06-20     26
yrefmtwq

yrefmtwq1#

这里有一个使用data.table和for循环的解决方案。
首先加载库,然后将数据框更改为数据表

library(data.table)
setDT(data)
setDT(date)

然后将res变量声明为numeric

date$res <- numeric()

然后运行for循环,遍历date集合中的每一行。

for(r in 1:nrow(date)){
    res_vector <- data[dat1>=date[r,]$dat1 & dat1<=date[r,]$dat2, values,]
    date[r,]$res <- ifelse(length(res_vector)>0, sum(res_vector), NA)
    }
41ik7eoe

41ik7eoe2#

为了让R将data.frame中的值解释为日期,我通常使用lubridate包中的as_date函数。之后,它是一个索引练习沿着的总和功能。

library(lubridate)

date$dat1 <- as_date(date$dat1)
date$dat2 <- as_date(date$dat2)
data$dat1 <- as_date(data$dat1)

date <- cbind(date,data.frame(res = apply(date, 1, function(x)sum(data$values[data$dat1 >= x[1] & data$dat1 <=x[2]]))))
date

相关问题