我有一个xts对象,它包含24小时内的多个参数(每分钟测量一次)。根据时间,我在4个'时间'(tod)选项中添加了一个列分组:'上午','下午','晚上'和'晚上'。
我想提取整个时期的列(参数)的平均值和标准差,以及一天中的时间('tod')。
我试图首先将xts对象转换为数据框,但是列有类因子而不是数字的问题。我也试过'聚合',但是当我使用聚合时,我得到了非常奇怪的输出(或错误)。这是一个例子:
例如,用于创建更小版本的数据的代码:
# time vector:
Time <- ISOdatetime(2015,01,01,6,12,0) + seq(0:(0.5*60-1))*1*60
# sample parameter columns
a <- 1:30
b <- 31:60
c<-seq(1,90,3)
# a sample xts object 'tester'
tester <- xts(cbind(a,b,c),Time)
# assign 'time of day':
tester$tod <- NA
tester$tod["T06:00/T06:20"]<-"night"
tester$tod["T06:21/T11:30"]<-"morning"
tester$tod["T06:31/T06:50"]<-"afternoon"
例如我如何尝试获取a,b,c的所有数据的平均值以及使用'aggregate'的'tod'(注意我的数据中有NA,但这不是问题):
tester$group = 1 #create a group column just to get the means for all data
mean_all <- aggregate(.~group, data=tester, FUN=mean, na.rm = TRUE, na.action=NULL)
meann_tod <- aggregate(.~tod, data=tester, FUN=mean, na.rm = TRUE, na.action=NULL)
不幸的是,这不起作用,虽然没有错误,但值完全错误。
任何建议都会非常感激,我想这将是一项非常简单的任务!
答案 0 :(得分:2)
当您尝试创建字符向量tod
时,您需要将coredata矩阵强制为字符而不是数字。作者确实发出警告,当它基本上拒绝让你搞砸了你的其他数据,但是你忽略了它(直到我做了一些额外的工作后我才理解它。)你可以构造一个数字向量来进行分组:
> tester$tod <- NA
> tester$tod["T06:00/T06:20"]<-1
> tester$tod["T06:21/T11:30"]<-2
> tester$tod["T06:31/T06:50"]<-3
>
> tester$group = 1
> (mean_all <- aggregate(.~group, data=tester, FUN=mean, na.rm = TRUE, na.action=NULL))
group a b c tod
1 1 15.5 45.5 44.5 2.133333
> (meann_tod <- aggregate(.~tod, data=tester, FUN=mean, na.rm = TRUE, na.action=NULL))
tod a b c group
1 1 4.5 34.5 11.5 1
2 2 13.5 43.5 38.5 1
3 3 24.5 54.5 71.5 1
我可能会从公式中省略“group”变量:
> (meann_tod <- aggregate(cbind(a,b,c)~tod, data=tester, FUN=mean, na.rm = TRUE, na.action=NULL))
tod a b c
1 1 4.5 34.5 11.5
2 2 13.5 43.5 38.5
3 3 24.5 54.5 71.5