我有一个包含多年时间数据的数据框。它有其他数据,名称,数量和日期。我想将数据框子化为年度季度,以衡量相应季度的某些方面。例如,我希望仅在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"))
但我没有得到数据的子集框架。
建议?
答案 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"))<=3
为TRUE
的所有行。
如果要将数据拆分为四分之一,可以制作一个小的映射表:
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