R - Извличане на обобщена статистика за всички колони в xts обект или директно, или първо конвертиране в рамка с данни

Имам обект xts, който включва множество параметри за период от 24 часа (измервания всяка минута). Въз основа на часа добавих колона, групирана в 4 опции за „час от деня“ (tod): „сутрин“, „следобед“, „вечер“ и „нощ“.

Бих искал да извлека средните стойности и стандартните отклонения на колоните (параметри) за целия период, а също и по време на деня („tod“).

Опитах се първо да преобразувам обекта xts в рамка с данни, но имам проблеми с колоните, които са от класов фактор вместо числови. Опитах също „aggregate“, но получавам наистина странни резултати (или грешки), когато използвам aggregate. Ето един пример:

например код за създаване на много по-малка версия на моите данни:

# 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 трябваше да принудите матрицата на основните данни да бъде символна, а не числова. Авторите издадоха предупреждение, когато основно отказа да ви позволи да объркате другите си данни, но вие го пренебрегнахте (и аз не го разбрах, докато не свърших допълнителна работа.) Можете да конструирате цифров вектор, за да направите групирането:

> 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