ваш пример data.frame не работает должным образом, вот один;) сначала вы можете поместить данные в подмножество, а затем вычислить, сколько строк у вас в этом подмножестве по сравнению с основным набором.
df <- data.frame(age = c(18,19,29),
rate = c(1.2,4.5,6.8),
sex = c("male","female","male"),
stringsAsFactors = F)
df_sub <- subset(df, age==18 & sex %in% "male")
df_rate <- nrow(df_sub)/nrow(df)
Хотя если вы говорите, что filter и select слишком медленные, вы можете преобразовать ваш data.frame в data.table, обычно он быстрее, чем data.frames.
library(data.table)
dt <- as.data.table(df)
nrow(dt[age==18 & sex %in% "male"])/nrow(dt)
# or more data.table-like:
dt[age==18 & sex %in% "male", .N] / dt[,.N]