R: Рассчитайте средства для подмножества группы

StackOverflow https://stackoverflow.com/questions/9342891

  •  27-10-2019
  •  | 
  •  

Вопрос

Я хочу рассчитать среднее для каждого «дня», но для части дня (время = 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
Это было полезно?

Решение

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

aggregate(StomCond_Trunc~Day,data=subset(sap,Time>=12 & Time<=14),mean)

Другие советы

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

Пример:

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

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.

Повторяя разницу между двумя подходами, используя Data.table 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 

Используя ваш исходный метод, но с меньшим количеством печати:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top