R - извлечение сводной статистики для всех столбцов в объекте 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 как для всех данных, так и с помощью «tod» с использованием «aggregate» (обратите внимание, что в моих данных есть 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)

К сожалению, это не работает, хотя ошибок нет, значения полностью неверны.

Любой совет будет очень признателен, я представлял, что это будет очень простой задачей!


person user3765214    schedule 22.06.2014    source источник


Ответы (1)


Когда вы пытались создать вектор символов, 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
person IRTFM    schedule 22.06.2014