R: Рассчитать среднее для подмножества группы - PullRequest
6 голосов
/ 18 февраля 2012

Я хочу вычислить среднее значение для каждого «дня», но для части дня (время = 12-14). Этот код работает для меня, но я должен вводить каждый день как новую строку кода, которая будет составлять сотни строк.

Кажется, это должно быть просто. Я сделал это легко, когда группирующие переменные одинаковы, но не знаю, как это сделать, когда я не хочу включать все значения за день. Есть ли лучший способ сделать это?

sapply(sap[sap$Day==165 & sap$Time %in% c(12,12.1,12.2,12.3,12.4,12.5,13,13.1,13.2,13.3,13.4,13.5, 14), ],mean)

sapply(sap[sap$Day==166 & sap$Time %in% c(12,12.1,12.2,12.3,12.4,12.5,13,13.1,13.2,13.3,13.4,13.5, 14), ],mean)

Вот как выглядят данные:

Day Time    StomCond_Trunc
165 12      33.57189926
165 12.1    50.29437636
165 12.2    35.59876214
165 12.3    24.39879768

Ответы [ 3 ]

10 голосов
/ 18 февраля 2012

Попробуйте это:

aggregate(StomCond_Trunc~Day,data=subset(sap,Time>=12 & Time<=14),mean)
3 голосов
/ 19 февраля 2012

Если у вас большой набор данных, вы также можете заглянуть в пакет data.table. Преобразовать data.frame в data.table довольно просто.

Пример:

Большой (ish) набор данных

df <- data.frame(Day=1:1000000,Time=sample(1:14,1000000,replace=T),StomCond_Trunc=rnorm(100000)*20)

Использование агрегата на data.frame

>system.time(aggregate(StomCond_Trunc~Day,data=subset(df,Time>=12 & Time<=14),mean))
   user  system elapsed 
 16.255   0.377  24.263

Преобразование его в data.table

 dt <- data.table(df,key="Time")

>system.time(dt[Time>=12 & Time<=14,mean(StomCond_Trunc),by=Day])
   user  system elapsed 
  9.534   0.178  15.270 

Обновление от Матфея . Это время значительно улучшилось с тех пор, как изначально был получен ответ, благодаря новой функции оптимизации в data.table 1.8.2.

Повторная проверка разницы между двумя подходами с использованием таблицы данных 1.8.2 в R 2.15.1:

df <- data.frame(Day=1:1000000,
                 Time=sample(1:14,1000000,replace=T),
                 StomCond_Trunc=rnorm(100000)*20)
system.time(aggregate(StomCond_Trunc~Day,data=subset(df,Time>=12 & Time<=14),mean)) 
#   user  system elapsed 
#  10.19    0.27   10.47

dt <- data.table(df,key="Time") 
system.time(dt[Time>=12 & Time<=14,mean(StomCond_Trunc),by=Day]) 
#   user  system elapsed 
#   0.31    0.00    0.31 
0 голосов
/ 24 марта 2012

Используя ваш оригинальный метод, но с меньшим набором:

sapply(sap[sap$Day==165 & sap$Time %in% seq(12, 14, 0.1), ],mean)

Однако это только немного лучший метод, чем ваш оригинальный. Это не так гибко, как другие ответы, так как это зависит от 0,1 приращения ваших значений времени. Другие методы не заботятся о размере приращения, что делает их более универсальными. Я бы порекомендовал @ Maiasaura ответ с data.table

...