在R中创建季度子集

时间:2014-05-21 23:21:42

标签: r date

我有一个包含多年时间数据的数据框。它有其他数据,名称,数量和日期。我想将数据框子化为年度季度,以衡量相应季度的某些方面。例如,我希望仅在1月,2月和3月看到收入。

我已确定日期列是时间序列:

class(data_frame$launch_date)
>"Date"

我已经尝试过这段代码,从3月前的第一季度开始获取数据:

subset(data_frame, format.Date(launch_date, "%m") <= "03")

但它没有给我一个新的数据框架和这个回复:

<0 rows> (or 0-length row.names)

我试过了

data_frame_q1 <- data.frame(data_frame, data_frame$launched < as.Date("2013-03-31"))

但我没有得到数据的子集框架。

建议?

4 个答案:

答案 0 :(得分:4)

似乎对我有用,不知道你做了什么:

data_frame <- data.frame(
 id=1:5,
 launch_date=seq.Date(as.Date("2014-01-01"),as.Date("2014-05-01"),by="1 month")
)

#  id launch_date
#1  1  2014-01-01
#2  2  2014-02-01
#3  3  2014-03-01
#4  4  2014-04-01
#5  5  2014-05-01

class(data_frame$launch_date)
#[1] "Date"

subset(data_frame, format.Date(launch_date, "%m") <= "03")

#  id launch_date
#1  1  2014-01-01
#2  2  2014-02-01
#3  3  2014-03-01

虽然使用实际数字可能更安全,但是:

subset(data_frame, as.numeric(format(launch_date, "%m")) <= 3)

#  id launch_date
#1  1  2014-01-01
#2  2  2014-02-01
#3  3  2014-03-01

答案 1 :(得分:3)

只需将我的评论转化为答案......

library(lubridate)
subset(data_frame, quarter(launch_date) == 1)

## Using @thelatemail's data

> subset(data_frame, quarter(launch_date) == 1)
  id launch_date
1  1  2014-01-01
2  2  2014-02-01
3  3  2014-03-01

虽然我也对你的方法有什么问题感到困惑。也许你没有得到正确的列名?在开始时您使用launch_date,但在data_frame_q1中使用launched

答案 2 :(得分:3)

我会为季度创建一个新变量。

data_frame$quarter <- quarters(data_frame$launch_date)

然后您可以像这样对数据进行分组:

subset(data_frame,quarter=='Q1')

使用@thelatemail数据:

data_frame
  id launch_date quarter
1  1  2014-01-01      Q1
2  2  2014-02-01      Q1
3  3  2014-03-01      Q1
4  4  2014-04-01      Q2
5  5  2014-05-01      Q2

subset(data_frame,quarter=='Q1')
  id launch_date quarter
1  1  2014-01-01      Q1
2  2  2014-02-01      Q1
3  3  2014-03-01      Q1

答案 3 :(得分:3)

你很接近,但你需要学习如何正确地分组数据。

一些评论:不要使用subset。它有效,但你应该习惯更多的&#34; R&#34;做事的方式。使用[将数据框设置为子集。其次,如果函数的参数是format.Date,则不需要专门调用Date;你可以打电话给format,R会为你挑选合适的功能。

因此,您的功能无法正常工作的原因是您与character类型的<=类型进行比较是不允许的。将它们转换为数字,它将起作用:。我不知道为什么你的原作不起作用。它对我有用。

# Generate some data
set.seed(1)
n<-100
data_frame<-data.frame(launch_date=as.Date(Sys.time())+runif(n,1,365))

subset(data_frame,as.numeric(format(launch_date, "%m"))<=3)

但是,请尝试使用subset运算符

,而不是使用[
data_frame[as.numeric(format(data_frame$launch_date, "%m"))<=3,]

这意味着返回as.numeric(format(data_frame$launch_date, "%m"))<=3TRUE的所有行。

如果要将数据拆分为四分之一,可以制作一个小的映射表:

quarters.map<-data.frame(month=1:12,quarter=rep(1:4,each=3))
#    month quarter
# 1      1       1
# 2      2       1
# 3      3       1
# 4      4       2
# 5      5       2    

然后只需merge就可以了:

head(merge(data_frame,quarters.map))
#   month launch_date quarter
# 1     1  2015-01-14       1
# 2     1  2015-01-17       1
# 3     1  2015-01-29       1
# 4     1  2015-01-20       1
# 5     1  2015-01-10       1
# 6     1  2015-01-17       1