R: Рассчитайте средства для подмножества группы
-
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