R 按组选择前n个值,其中n取决于数据框中的其他值

R 按组选择前n个值,其中n取决于数据框中的其他值,r,dataframe,dplyr,tidyverse,top-n,R,Dataframe,Dplyr,Tidyverse,Top N,一般来说,我对r和编码相当陌生。非常感谢您的帮助: 我正在尝试按组选择前n个值,其中n取决于以下数据框中的另一个称为因子的值。然后,应按组汇总所选值,以计算平均d100。我的目标是为每组d100获得一个值 背景:在林业中有一个称为d100的指标,它是每公顷100棵最厚树木的平均直径。如果采样面积小于1公顷,则需要相应地选择较少的树木来计算d100。这就是这个因素的作用 首先,我尝试将因子作为自己的列放入数据框架中。然后我想也许有一个类似查找表的东西会有所帮助,因为R表示n必须是一个数字。但我不知

一般来说,我对r和编码相当陌生。非常感谢您的帮助:

我正在尝试按组选择前n个值,其中n取决于以下数据框中的另一个称为因子的值。然后,应按组汇总所选值,以计算平均d100。我的目标是为每组d100获得一个值

背景:在林业中有一个称为d100的指标,它是每公顷100棵最厚树木的平均直径。如果采样面积小于1公顷,则需要相应地选择较少的树木来计算d100。这就是这个因素的作用

首先,我尝试将因子作为自己的列放入数据框架中。然后我想也许有一个类似查找表的东西会有所帮助,因为R表示n必须是一个数字。但我不知道如何创建查找函数。请参阅示例代码的最后一部分。或者在使用df$因子之前总结它会起作用吗

样本数据:

我指出了一些我不确定如何在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'))
我已经找到了一个问题的答案,这个答案似乎与我的答案相似,但没有太大帮助。

因为每个组中的所有因子值都是相同的,所以您可以选择任意一个因子值


这东西对你有帮助吗
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