如何获得R中某一特定日期前N天的平均气温? [英] How to get the average temperature for N days prior to a specific date in R?
本文介绍了如何获得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
取出生日期前三天,计算平均值,然后return
adata.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屋!
查看全文