我有一个包含多年时间数据的数据框。它具有其他数据,包括名称,金额和日期。我想将数据框细分为年度季度,以衡量相应季度的某些方面。例如,我只想查看一月,二月和三月的收入。
我确保日期列是一个时间序列:
class(data_frame$launch_date)
>"Date"
我尝试过此代码,以获取3月之前(包括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"))
但是我没有得到数据的子帧。
有什么建议吗?
您接近了,但是您需要学习如何正确地对数据进行子集化。
几点评论:请勿使用subset
。它可以工作,但是您应该习惯于更“ R”的工作方式。用替换数据框[
。其次,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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句