【发布时间】:2021-02-12 15:47:08
【问题描述】:
我有以下数据集,并且我想获得每个(物候)现象和站点的平均日期(月和日)。看来我可以直接使用 mean 函数来计算日期格式对象的平均值。但是,如果我使用函数as.Date 将月份日期转换为日期,则会添加年份,并且平均日期与年份无关。如何仅根据月份和日期直接计算平均日期?
【问题讨论】:
-
您能否在这个问题中使用“dput()”和您的预期结果分享您的数据集?
我有以下数据集,并且我想获得每个(物候)现象和站点的平均日期(月和日)。看来我可以直接使用 mean 函数来计算日期格式对象的平均值。但是,如果我使用函数as.Date 将月份日期转换为日期,则会添加年份,并且平均日期与年份无关。如何仅根据月份和日期直接计算平均日期?
【问题讨论】:
您无法计算一年中的“平均月+日”,因为并非每年都有相同的天数。所以你需要为你的计算选择一个固定的年份。
那么你可以:
【讨论】:
您可以使用 lubridate 包中的 yday 函数将每个日期转换为该年的日期,然后平均每个 Pheno 的日期。一年中的一天到一个月和一天的转换取决于您想要闰年还是非闰年的日期。我报告了两个日期。
代码如下:
library(tidyverse)
library(lubridate)
#
# calculate average day of year
#
average_doy <- df %>% mutate(day_of_year = yday(as.Date(paste(Year,Month,Day, sep="-")))) %>%
group_by(Pheno) %>%
summarize(avg_doy = round(mean(day_of_year,0)))
# set base years
non_leap_year <- 2003
leap_year <- 2004
#
# convert day of year to average day using base years
#
averages <- average_doy %>%
mutate(avg_non_leap_year_mon_day = paste(avg_doy, non_leap_year, sep="_") %>%
as.Date(format = "%j_%Y") %>%
str_remove(paste0(non_leap_year,"-")),
avg_leap_year_mon_day = paste(avg_doy, leap_year, sep="_") %>%
as.Date(format = "%j_%Y") %>%
str_remove(paste0(leap_year,"-") ))
使用数据的前七行,这给出了
# A tibble: 3 x 4
Pheno avg_doy avg_non_leap_year_mon_day avg_leap_year_mon_day
<chr> <dbl> <chr> <chr>
1 Dormant 348 12-14 12-13
2 Tillering 343 12-09 12-08
3 Turning green 48 02-17 02-17
【讨论】: