Вместо использования цикла и выполнения нескольких вариантов поднабора есть лучшие параметры R, такие как функция split
вдоль lapply
.
Еще один более быстрый вариант - использование пакета dplyr. Этот пакет очень удобен для решения подобных проблем. Вот возможное однострочное решение:
df<-structure(list(deployID = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "A", class = "factor"),
depth = c(66.5, 55, 28.5, 23.5, 48.5, 53.5), datetime = c("18/03/2018 00:00",
"18/03/2018 00:02", "18/03/2018 00:05", "18/03/2018 00:07",
"18/03/2018 00:10", "18/03/2018 00:12"), date = structure(c(1L,
1L, 1L, 2L, 2L, 2L), .Label = c("18/03/2018", "19/03/2018"
), class = "factor")), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
library(dplyr)
df %>% group_by(deployID, date) %>% summarize(targetdepth=sum(depth<70 & depth>30 ), total=n(), targetdepth/total)
#deployID date targetdepth total `targetdepth/total`
#<fct> <fct> <int> <int> <dbl>
#A 18/03/2018 2 3 0.667
#A 19/03/2018 2 3 0.667
Здесь функция group_by выполняет поднабор по дням и deployID, затем вычисляет количество случаев <70 и> 30 и делит их на общее количество случаев в каждом подмножестве.
Это также значительно быстрее, чем при использовании цикла.