数据框中的动态过滤器

时间:2014-03-21 06:44:51

标签: r dataframe

我在下面有一个示例数据框:

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那样动态地得到它?

4 个答案:

答案 0 :(得分:2)

我建议使用zooyearmon是您需要的课程:

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