R - 直接或首先转换为数据框,提取xts对象中所有列的摘要统计信息

时间:2014-06-22 18:16:37

标签: r dataframe aggregate xts

我有一个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)

不幸的是,这不起作用,虽然没有错误,但值完全错误。

任何建议都会非常感激,我想这将是一项非常简单的任务!

1 个答案:

答案 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