如何获得R中某一特定日期前N天的平均气温? [英] How to get the average temperature for N days prior to a specific date in R?

查看:13
本文介绍了如何获得R中某一特定日期前N天的平均气温?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个数据集:一个数据集(A)包含每天的温度,另一个数据集(B)包含个人ID和出生日期(道布)。我需要得到道布之前最近3天的平均气温。例如:如果个人1出生于2021年2月20日,我需要2021年02月17日到2021年02月19日的平均气温。有没有办法在R中这样做,所以我的输出是ind|道布|avg_temp。 以下是一个数据示例(在我的实际案例中,我的数据具有非常多的天数和个数):

> temp <- c(26,27,28,30,32,27,28,29)
> date <- as.Date(c('02-15-2021', '02-16-2021', '02-17-2021', '02-18-2021', '02-19-2021', '02-20-2021', '02-21-2021',
+ '02-22-2021'), "%m-%d-%Y")
> A <- data.frame(date, temp)
> id <- c(1,2,3,4,5,6,7,8,9,10)
> dob <- as.Date(c('02-18-2021', '02-17-2021', '02-20-2021', '02-23-2021', '02-25-2021', '02-23-2021', '02-17-2021',
+                  '02-25-2021', '02-25-2021', '02-23-2021'), "%m-%d-%Y")
> B <- data.frame(id, dob) 

如果日期不是完整的3天,它将用可用天数(2或1)计算平均值,如果没有可用天数,它将返回0作为平均值。

有人能在R中帮我做这件事吗?正如我上面提到的,我的数据集相当大,大约有37,000个ID,气温从2007年到2021年不等。

提前谢谢您。

推荐答案

这里有一种方法。我们不会重复计算,而是首先获取出生日期的向量,然后再将它们合并到一起,因为有几个人的出生日期相同。该函数本身非常简单。从A取出生日期前三天,计算平均值,然后returnadata.frame,这将使我们可以轻松地将结果合并到B中。

library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union
myfunc <- function(x){
  three_days <- as.Date(x - ddays(3))
  
  A <- A[A$date < x & A$date >= three_days , ]
  avg_temp <- mean(A$temp)
  dat <- data.frame(dob = x, avg_temp = avg_temp)
  return(dat)
}

dobs <- unique(B$dob)

avg_temps <- lapply(dobs, myfunc)
avg_temps <- do.call(rbind, avg_temps)

B <- merge(B, avg_temps, by = "dob")

B
#>           dob id avg_temp
#> 1  2021-02-17  2     26.5
#> 2  2021-02-17  7     26.5
#> 3  2021-02-18  1     27.0
#> 4  2021-02-20  3     30.0
#> 5  2021-02-23  4     28.0
#> 6  2021-02-23  6     28.0
#> 7  2021-02-23 10     28.0
#> 8  2021-02-25  5     29.0
#> 9  2021-02-25  8     29.0
#> 10 2021-02-25  9     29.0

reprex package(v2.0.1)于2022-02-02创建

这篇关于如何获得R中某一特定日期前N天的平均气温?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆