выберите верхние n значений по группе с n в зависимости от другого значения в фрейме данных

Я новичок в 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'))

Я уже нашел это ответ на проблему, которая кажется похожей на мою, но не совсем помогла.


person kate99    schedule 16.04.2021    source источник
comment
Что-то вроде этого поможет вам stackoverflow.com/questions/12925063/   -  person hannes101    schedule 16.04.2021


Ответы (1)


Поскольку все значения factor в каждой группе одинаковы, вы можете выбрать любое значение factor.

library(dplyr)

df %>% 
  group_by(group) %>% 
  top_n(BHD, n = 100* first(factor))  %>%
  ungroup 

#   group   BHD factor
#   <dbl> <dbl>  <dbl>
# 1     1  25.8 0.0707
# 2     1  24.6 0.0707
# 3     1  27.6 0.0707
# 4     1  28.3 0.0707
# 5     1  29.2 0.0707
# 6     2  28.8 0.126 
# 7     2  39.5 0.126 
# 8     2  23.1 0.126 
# 9     2  27.9 0.126 
#10     2  31.7 0.126 
# … with 13 more rows
person Ronak Shah    schedule 16.04.2021