我有一个包含 4000 列和 3000 行的数据框。列是公司,行是每日股票收盘价。这些行包含基于月份日期的每日观察数据。现在,我想要删除每个月最后一个日期之间的行,即我想根据数据框中的月份可用日期仅获取该月最后一天的数据。每个月的最后一个日期应该根据我的数据框中可用的日期列。我的问题与其他人的主要挑战和区别是上个月的日期应该根据我的数据框中提供的日期。它的财务数据和非交易日并没有。交易日的数量与其他类型的行业不同,我说明了我的数据框架的某些部分。
Date A B
30/12/1999 1 3
04/01/2000 1 3
05/01/2000 1 3
06/01/2000 1 3
07/01/2000 1 3
10/01/2000 1 3
11/01/2000 1 3
12/01/2000 1 3
13/01/2000 1 3
14/01/2000 1 3
17/01/2000 1 3
18/01/2000 1 3
19/01/2000 1 3
20/01/2000 1 3
21/01/2000 1 3
24/01/2000 1 3
25/01/2000 1 3
26/01/2000 1 3
27/01/2000 1 3
28/01/2000 1 3
31/01/2000 1 3
01/02/2000 1 3
02/02/2000 1 3
03/02/2000 1 3
04/02/2000 1 3
07/02/2000 1 3
08/02/2000 1 3
09/02/2000 1 3
10/02/2000 1 3
11/02/2000 1 3
14/02/2000 1 3
15/02/2000 1 3
16/02/2000 1 3
17/02/2000 1 3
18/02/2000 1 3
21/02/2000 1 3
22/02/2000 1 3
23/02/2000 1 3
24/02/2000 1 3
25/02/2000 1 3
28/02/2000 1 3
29/02/2000 1 3
Run Code Online (Sandbox Code Playgroud)
所需输出
Date A B
30/12/1999 1 3
31/01/2000 1 3
29/02/2000 1 3
Run Code Online (Sandbox Code Playgroud)
我非常感谢您在这方面的帮助。
使用lubridateand dplyr,首先解析Date
library(lubridate)
library(dplyr)
df$Date <- dmy(df$Date)
Run Code Online (Sandbox Code Playgroud)
现在我们可以构建一个dplyr链来过滤:
df %>% group_by(month = month(Date), year = year(Date)) %>% filter(Date == max(Date))
Run Code Online (Sandbox Code Playgroud)
我们添加的位置group_by month和year列,然后只添加每个组的filter日期。max它返回
Source: local data frame [3 x 5]
Groups: month, year [3]
Date A B month year
(time) (int) (int) (dbl) (dbl)
1 1999-12-30 1 3 12 1999
2 2000-01-31 1 3 1 2000
3 2000-02-29 1 3 2 2000
Run Code Online (Sandbox Code Playgroud)
当然,如果您愿意,也可以在 R 库中完成这一切。
编辑: H/T @Jaap 建议使用group_by添加列而不是单独的mutate. 您也可以使用slice(which.max(Date))该术语来代替filter;如果这是一个问题的话,它可能会更快地提示。