Я не проверял, верны ли цифры, но это, используя data.table()
из пакета data.table вместо data.frame, должно работать на то, что, я думаю, вы ищете ...
dt1[V1 > quantile(V1, 0.25) & V1 < quantile(V1, 0.75),
mean(V1), keyby = Effect]
Это группирует ваши данные по «Эффекту», внутри этих групп, принимая значения в пределах 50% средних значений и принимая их среднее значение.
Редактировать, код выше сначала взял подмножество перед группировкой (извините, тестирование пропустило это), чтобы взять квантиль каждой группы:
dt1[dcast(dt1[, .(unlist(lapply(.SD, quantile, c(0.25, 0.75))), qt = c("lo", "up")), by = Effect], ... ~ qt, value.var = "V1"), on = "Effect"][V1 >= lo & V1 <= up, mean(V1), keyby = Effect]
Это дает те же значения, что и ответ Ронака. Он получает квантиль каждой группы, расширяет его dcast
, объединяет его с исходной таблицей data.table, затем поднастраивает, используя новые переменные lo и up (нижняя и верхняя границы квантиля), и получает среднее значение для каждой группы оставшихся значений. .