首页 > 解决方案 > 过滤时间戳 R 中的最后 n 个观测值

问题描述

我是 R 的新手,我有一个简单的问题。

我有一个数据框,其中有一列关于时间戳和各种其他功能。时间戳列是 31 天,我必须得到时间戳的最后 n 天(比如说 16 天)。

假设有 31 天,它将给我过去 16 天(10 月 16 日至 10 月 31 日)的观察结果。我知道如何在 Python 中做到这一点,但我不知道如何在 R 中做到这一点。

样本df:

f1 f2 f3 timestamp
1  2  3  2020-10-02 14:36:03
2  3  5  2020-10-03 14:26:03
1  2  3  2020-10-05 14:36:03
2  3  5  2020-10-05 14:26:03
1  2  3  2020-10-07 14:36:03
2  3  5  2020-10-10 14:26:03
1  2  3  2020-10-12 14:36:03
2  3  5  2020-10-13 14:26:03
1  2  3  2020-10-15 14:36:03
2  3  5  2020-10-16 14:26:03
1  2  3  2020-10-22 14:36:03
2  3  5  2020-10-25 14:26:03
1  2  3  2020-10-26 14:36:03
2  3  5  2020-10-31 14:26:03

结果应该是什么样子:

f1 f2 f3 timestamp
2  3  5  2020-10-16 14:26:03
1  2  3  2020-10-22 14:36:03
2  3  5  2020-10-25 14:26:03
1  2  3  2020-10-26 14:36:03
2  3  5  2020-10-31 14:26:03

每个观察的时间戳中的时间都不同,上面的框架仅用于说明目的。任何帮助,将不胜感激。

更新以消除混乱:

我不能像在原始数据框中那样使用 tail() 函数,每天有多个值。抱歉没有说清楚。

标签: rdatetimedplyr

解决方案


也许你需要lubridatesubset

library(lubridate)
subset(
  df,
  day(timestamp) >= days_in_month(timestamp) - 15
)

或以某种dplyr方式

df %>%
  filter(between(day(timestamp), days_in_month(timestamp) - 15, days_in_month(timestamp)))

这使

   f1 f2 f3           timestamp
10  2  3  5 2020-10-16 14:26:03
11  1  2  3 2020-10-22 14:36:03
12  2  3  5 2020-10-25 14:26:03
13  1  2  3 2020-10-26 14:36:03
14  2  3  5 2020-10-31 14:26:03

数据

> dput(df)
structure(list(f1 = c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L), f2 = c(2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L,
2L, 3L, 2L, 3L), f3 = c(3L, 5L, 3L, 5L, 3L, 5L, 3L, 5L, 3L, 5L,
3L, 5L, 3L, 5L), timestamp = structure(c(1601642163, 1601727963,
1601901363, 1601900763, 1602074163, 1602332763, 1602506163, 1602591963,
1602765363, 1602851163, 1603370163, 1603632363, 1603719363, 1604150763
), class = c("POSIXct", "POSIXt"), tzone = "")), row.names = c(NA,
-14L), class = "data.frame")

推荐阅读