R 如何使用循环或应用函数计算两个日期范围内变量的平均值?

R 如何使用循环或应用函数计算两个日期范围内变量的平均值?,r,loops,date,average,apply,R,Loops,Date,Average,Apply,我试图计算一个日期范围(例如,从7月21日到7月28日)之间的设备计数平均值 这就是我的数据,例如: # A tibble: 580,742 x 14 country_region_~ country_region sub_region_1 sub_region_2 census_fips_code date <chr> <chr> <chr> <chr>

我试图计算一个日期范围(例如,从7月21日到7月28日)之间的设备计数平均值

这就是我的数据,例如:

# A tibble: 580,742 x 14
   country_region_~ country_region sub_region_1 sub_region_2 census_fips_code date      
   <chr>            <chr>          <chr>        <chr>        <chr>            <date>    
 1 US               United States  NA           NA           NA               2020-02-15
 2 US               United States  NA           NA           NA               2020-02-16
 3 US               United States  NA           NA           NA               2020-02-17
 4 US               United States  NA           NA           NA               2020-02-18
 5 US               United States  NA           NA           NA               2020-02-19
 6 US               United States  NA           NA           NA               2020-02-20
 7 US               United States  NA           NA           NA               2020-02-21
 8 US               United States  NA           NA           NA               2020-02-22
 9 US               United States  NA           NA           NA               2020-02-23
10 US               United States  NA           NA           NA               2020-02-24
# ... with 580,732 more rows, and 8 more variables:
#   retail_and_recreation_percent_change_from_baseline <dbl>,
#   grocery_and_pharmacy_percent_change_from_baseline <dbl>,
#   parks_percent_change_from_baseline <dbl>,
#   transit_stations_percent_change_from_baseline <dbl>,
#   workplaces_percent_change_from_baseline <dbl>,
#   residential_percent_change_from_baseline <dbl>, date2 <date>, date3 <date>
#tible:580742 x 14
国家/地区~国家/地区子地区1子地区2人口普查fips代码日期
1美国NA 2020-02-15
2美国NA 2020-02-16
3美国NA 2020-02-17
4美国NA 2020-02-18
5美国NA 2020-02-19
6美国NA 2020-02-20
7美国NA 2020-02-21
8美国NA 2020-02-22
9美国NA 2020-02-23
10美国NA 2020-02-24
# ... 还有580732行和8个变量:
#零售业和娱乐业与基线相比的变化百分比,
#杂货店和药店的百分比与基线相比发生了变化,
#公园百分比与基线相比发生变化,
#交通站点相对于基线的变化百分比,
#工作场所相对于基线的变化百分比,
#自基线、日期2、日期3起的居住百分比变化
我可以用以下代码手动计算日期范围之间的平均值:

library(dplyr)
retailavg <- google.mobility %>% 
    mutate(weekrange = date >= "2020-02-15" & date <= "2020-02-21") %>% 
    filter(weekrange) %>% 
    group_by(sub_region_2) %>% 
    summarise(avgretail = mean(retail_and_recreation_percent_change_from_baseline))
库(dplyr)
零售平均%
变异(周周期=日期>=“2020-02-15”和日期%
过滤器(周周期)%>%
分组依据(次区域2)%>%
总结(avgretail=平均值(零售和娱乐百分比与基线相比的变化))

循环是我最糟糕的噩梦,但如果有任何方法可以创建一个循环/应用程序,这样我就不必手动执行每个日期范围,这肯定会有帮助!我是一个绝对的初学者,所以任何建议都会有帮助!

我不知道是否所有的摘要周期都会在一周的同一天对齐(“对齐周”)坦白地说,即使每件事都是完美的周对齐,也可以使用非周对齐的答案,所以如果你认为你需要灵活性,那么就这样做吧

周对齐日期范围 如果总是“按周”(无论它们在哪一天对齐),那么您可以简单地根据该变量计算周数和分组

库(dplyr)
dat%>%
变异(周=整数(日期-截止日期(“2020-02-15”))%/%7)%>%
按(周)分组%>%
总结(
开始日期=最小(日期),结束日期=最大(日期),
avgval=平均值(val)
)
##A tibble:53 x 4
#周开始日期结束日期平均值
#                
#  1    -7 2020-01-01 2020-01-03  0.525
#  2    -6 2020-01-04 2020-01-10  0.568
#  3    -5 2020-01-11 2020-01-17  0.460
#  4    -4 2020-01-18 2020-01-24  0.657
#  5    -3 2020-01-25 2020-01-31  0.468
#  6    -2 2020-02-01 2020-02-07  0.494
#  7    -1 2020-02-08 2020-02-14  0.444
#  8     0 2020-02-15 2020-02-20  0.391
#  9     1 2020-02-22 2020-02-28  0.472
# 10     2 2020-02-29 2020-03-06  0.502
##…还有43行
其中的诀窍是,我们将周滚动调整为任意日期(此处为您的
“2020-02-15”
),这样一周中的这一天以及一年中这一天的每一次重复都将代表每个窗口的开始。下面是该窗口的示例:

dat%>%
变异(周=整数(日期-截止日期(“2020-02-15”))%/%7)%>%
按(周)分组%>%
筛选(周==0 |(周==-1和行数()==n())|(周==1和行数()==1))
##A tibble:17 x 3
##小组:一周[3]
#星期日
#           
#  1 2020-02-14 0.814     -1
#  2 2020-02-15 0.130      0
#  3 2020-02-15 0.811      0
#  4 2020-02-15 0.0691     0
#  5 2020-02-16 0.476      0
#  6 2020-02-16 0.537      0
#  7 2020-02-16 0.207      0
#  8 2020-02-18 0.210      0
#  9 2020-02-18 0.521      0
# 10 2020-02-18 0.998      0
# 11 2020-02-18 0.946      0
# 12 2020-02-18 0.309      0
# 13 2020-02-18 0.440      0
# 14 2020-02-18 0.0271     0
# 15 2020-02-20 0.148      0
# 16 2020-02-20 0.0295     0
# 17 2020-02-22 0.972      1
在这里,您可以看到
0
组包含从
“2020-02-15”
“2020-02-21”
(即使在这个随机数据中没有
02-21
)的范围。这里的实际数字-1、0、1完全是任意的,我们只是将它们用作它们的分组属性

不周对齐 这可以在不使用“非相等”或“范围”联接的情况下完成。不幸的是,
dplyr
本机不支持它(尽管它通过
dbplyr::sql_on
间接支持它),但这里有一些替代方法:
数据.table
sqldf
fuzzyjoin
(使用
dplyr
):

库(data.table)
达特%
分组人(日期=日期x)%>%
汇总(结束日期=最大值(结束日期),日期平均值=平均值(val))
##tibble:3 x 3
#日期结束日期日期平均值
#                  
# 1 2020-02-15 2020-02-21      0.391
# 2 2020-03-01 2020-03-05      0.534
# 3 2020-09-14 2020-09-30      0.480

数据:

set.seed(42)

dat您可以使用dput()函数共享一个可复制的示例吗?
date>=“2020-02-15”
是一个字符串比较,而不是日期的(类似数字)比较。在这种格式中,它足够接近,但可以肯定…
date>=as.date(“2020-02-15”)
更好。这是否回答了您的问题?