我在下面有一个示例数据框:
Name Rate Period
Ann 98 201403
Ann 97 201402
Ann 99 201401
Ann 94 201312
Ann 96 201311
Ann 92 201310
Ann 93 201309
Ben 92 201403
Ben 94 201402
Ben 96 201401
Ben 93 201312
Ben 99 201311
Ben 97 201310
Ben 92 201309
如何过滤数据框以仅获取过去6个月的数据?
期望的输出:
Name Rate Period
Ann 98 201403
Ann 97 201402
Ann 99 201401
Ann 94 201312
Ann 96 201311
Ann 92 201310
Ben 92 201403
Ben 94 201402
Ben 96 201401
Ben 93 201312
Ben 99 201311
Ben 97 201310
我可以通过子集化和提供像
这样的过滤器来实现dataset= subset(dataset, Period %in% ('201403','201402','201401','201312','201311','201310'))
但是由于时间会随着时间的推移而变得动态,有没有办法像Period >= date - 6
那样动态地得到它?
答案 0 :(得分:2)
我建议使用zoo
,yearmon
是您需要的课程:
library(zoo)
df_index <- as.yearmon(as.character(df$Period), format="%Y%m")
df[df_index > max(df_index) - 1/2, ]
Name Rate Period
1 Ann 98 201403
2 Ann 97 201402
3 Ann 99 201401
4 Ann 94 201312
5 Ann 96 201311
6 Ann 92 201310
8 Ben 92 201403
9 Ben 94 201402
10 Ben 96 201401
11 Ben 93 201312
12 Ben 99 201311
13 Ben 97 201310
答案 1 :(得分:1)
您可以将Period
列转换为factor
,将子集转换为前六列。
dataset[dataset$Period %in% as.factor(dataset$Period)[1:6], ]
## equivalent to
subset(dataset, Period %in% as.factor(Period)[1:6])
## Name Rate Period
## 1 Ann 98 201403
## 2 Ann 97 201402
## 3 Ann 99 201401
## 4 Ann 94 201312
## 5 Ann 96 201311
## 6 Ann 92 201310
## 8 Ben 92 201403
## 9 Ben 94 201402
## 10 Ben 96 201401
## 11 Ben 93 201312
## 12 Ben 99 201311
## 13 Ben 97 201310
答案 2 :(得分:0)
试试这个解决方案。它不需要任何额外的包。它会创建一个唯一的句点列表,按升序排序,然后选择最后一个6.请参阅tail
的帮助。
dataset <- subset(dataset, Period %in% tail(sort(unique(Period))))
请注意。此代码选择过去六个月在数据中观察。可能这个解决方案不适合您的需求。
答案 3 :(得分:0)
library(lubridate)
df$date <- ymd(paste0(df$Period, "01"))
df[max(df$date) - months(6) < df$date, ]
# Name Rate Period date
# 1 Ann 98 201403 2014-03-01
# 2 Ann 97 201402 2014-02-01
# 3 Ann 99 201401 2014-01-01
# 4 Ann 94 201312 2013-12-01
# 5 Ann 96 201311 2013-11-01
# 6 Ann 92 201310 2013-10-01
# 8 Ben 92 201403 2014-03-01
# 9 Ben 94 201402 2014-02-01
# 10 Ben 96 201401 2014-01-01
# 11 Ben 93 201312 2013-12-01
# 12 Ben 99 201311 2013-11-01
# 13 Ben 97 201310 2013-10-01