使用我在 R 中的时间序列的每个月的最后一天
Using the last day in each month of my time series in R
我只需要使用数据集中可用的最后一天来稍后进行汇总,但我没有成功...
library(tibbletime)
dataset <- data.frame(
timestamp = c("2010-01-01", "2010-01-03", "2010-01-23")
var = c( 1, 4, 11)
)
monthly_dataset <- as_tbl_time(dataset, index = timestamp) %>%
as_period("1 month")
我如何使用某些函数或 R 包来聚合我的数据集,以便仅使用最后一天可用?
一个选项可以是 lubridate
包,例如
library(lubridate)
library(dplyr)
dataset <- data.frame(
timestamp = c("2010-01-01", "2010-01-03",
"2010-01-23", "2010-02-01", "2010-02-03", "2010-02-23"),
var = c(1, 4, 11, 1, 4, 11)
)
dataset %>%
mutate(month = timestamp %>% ymd() %>% month()) %>%
group_by(month) %>%
slice_tail()
结果:
# A tibble: 2 x 3
# Groups: month [2]
timestamp var month
<chr> <dbl> <dbl>
1 2010-01-23 11 1
2 2010-02-23 11 2
Julian 的回答是一个不错的开始,但它不会跨越多年,因为分组变量不包含有关年份的信息。
执行此操作的典型方法是在 year-month 上分组,然后过滤到每个 year-month 组的最大日期。
此外,作为 tibbletime 的创建者,我强烈建议您不要再使用它。它已被弃用,不再受支持。您应该只使用 clock/lubridate 与 dplyr 等 tidyverse 包一起进行日期处理,或者如果您真的需要在时间序列上全力以赴,则应该使用 tsibble。
library(lubridate)
library(dplyr)
dataset <- tibble(
timestamp = c(
"2010-01-01", "2010-01-03", "2010-01-23",
"2010-02-01", "2010-02-03", "2011-02-23"
),
var = c(1, 4, 11, 1, 4, 11)
)
dataset <- mutate(dataset, timestamp = ymd(timestamp))
dataset <- dataset %>%
mutate(
year_month = floor_date(timestamp, "month"),
day = day(timestamp)
)
dataset %>%
group_by(year_month) %>%
filter(day == max(day)) %>%
ungroup()
#> # A tibble: 3 × 4
#> timestamp var year_month day
#> <date> <dbl> <date> <int>
#> 1 2010-01-23 11 2010-01-01 23
#> 2 2010-02-03 4 2010-02-01 3
#> 3 2011-02-23 11 2011-02-01 23
由 reprex package (v2.0.1)
于 2022-05-18 创建
我只需要使用数据集中可用的最后一天来稍后进行汇总,但我没有成功...
library(tibbletime)
dataset <- data.frame(
timestamp = c("2010-01-01", "2010-01-03", "2010-01-23")
var = c( 1, 4, 11)
)
monthly_dataset <- as_tbl_time(dataset, index = timestamp) %>%
as_period("1 month")
我如何使用某些函数或 R 包来聚合我的数据集,以便仅使用最后一天可用?
一个选项可以是 lubridate
包,例如
library(lubridate)
library(dplyr)
dataset <- data.frame(
timestamp = c("2010-01-01", "2010-01-03",
"2010-01-23", "2010-02-01", "2010-02-03", "2010-02-23"),
var = c(1, 4, 11, 1, 4, 11)
)
dataset %>%
mutate(month = timestamp %>% ymd() %>% month()) %>%
group_by(month) %>%
slice_tail()
结果:
# A tibble: 2 x 3
# Groups: month [2]
timestamp var month
<chr> <dbl> <dbl>
1 2010-01-23 11 1
2 2010-02-23 11 2
Julian 的回答是一个不错的开始,但它不会跨越多年,因为分组变量不包含有关年份的信息。
执行此操作的典型方法是在 year-month 上分组,然后过滤到每个 year-month 组的最大日期。
此外,作为 tibbletime 的创建者,我强烈建议您不要再使用它。它已被弃用,不再受支持。您应该只使用 clock/lubridate 与 dplyr 等 tidyverse 包一起进行日期处理,或者如果您真的需要在时间序列上全力以赴,则应该使用 tsibble。
library(lubridate)
library(dplyr)
dataset <- tibble(
timestamp = c(
"2010-01-01", "2010-01-03", "2010-01-23",
"2010-02-01", "2010-02-03", "2011-02-23"
),
var = c(1, 4, 11, 1, 4, 11)
)
dataset <- mutate(dataset, timestamp = ymd(timestamp))
dataset <- dataset %>%
mutate(
year_month = floor_date(timestamp, "month"),
day = day(timestamp)
)
dataset %>%
group_by(year_month) %>%
filter(day == max(day)) %>%
ungroup()
#> # A tibble: 3 × 4
#> timestamp var year_month day
#> <date> <dbl> <date> <int>
#> 1 2010-01-23 11 2010-01-01 23
#> 2 2010-02-03 4 2010-02-01 3
#> 3 2011-02-23 11 2011-02-01 23
由 reprex package (v2.0.1)
于 2022-05-18 创建