Я новичок в r и кодировании в целом. Ваша помощь будет высоко оценена :)
Я пытаюсь выбрать верхние n значений по группе, где n зависит от другого значения (далее называемого factor
) из моего фрейма данных. Затем выбранные значения следует суммировать по группам для расчета среднего значения (d100
). Моя цель - получить одно значение для d100
для каждой группы.
(Исходная информация: в лесном хозяйстве существует показатель под названием d100, который представляет собой средний диаметр 100 самых толстых деревьев на гектар. Если площадь выборки меньше 1 га, вам необходимо выбрать соответственно меньшее количество деревьев. для вычисления d100. Для этого и нужен коэффициент.)
Сначала я попытался поместить factor
в свой фрейм данных как собственный столбец. Затем я подумал, что, может быть, было бы полезно иметь что-то вроде справочной таблицы, потому что R сказал, что n должно быть одним числом. Но я не знаю, как создать функцию поиска. (См. последнюю часть примера кода.) Или, может быть, суммирование df$factor
перед его использованием поможет?
Пример данных:
(Выражения, которые я не знаю, как закодировать в R, я указал так: «Я не знаю, как это сделать»)
# creating sample data
library(tidyverse)
df <- data.frame(group = c(rep(1, each = 5), rep(2, each = 8), rep(3, each = 10)),
BHD = c(rnorm(23, mean = 30, sd = 5)),
factor = c(rep(pi*(15/100)^2, each = 5), rep(pi*(20/100)^2, each = 8), rep(pi*(25/100)^2, each = 10))
)
# group by ID, then select top_n values of df$BHD with n depending on value of df$factor
df %>%
group_by(group) %>%
slice_max(
BHD,
n = 100*df$factor,
with_ties = F) %>%
summarise(d100 = mean('sliced values per group'))
# other thought: having a "lookup-table" for the factor like this:
lt <- data.frame(group = c(1, 2, 3),
factor = c(pi*(15/100)^2, pi*(20/100)^2, pi*(25/100)^2))
# then
df %>%
group_by(group) %>%
slice_max(
BHD,
n = 100*lt$factor 'where lt$group == df$group',
with_ties = F) %>%
summarise(d100 = mean('sliced values per group'))
Я уже нашел это ответ на проблему, которая кажется похожей на мою, но не совсем помогла.