R 按组选择前n个值,其中n取决于数据框中的其他值
一般来说,我对r和编码相当陌生。非常感谢您的帮助: 我正在尝试按组选择前n个值,其中n取决于以下数据框中的另一个称为因子的值。然后,应按组汇总所选值,以计算平均d100。我的目标是为每组d100获得一个值 背景:在林业中有一个称为d100的指标,它是每公顷100棵最厚树木的平均直径。如果采样面积小于1公顷,则需要相应地选择较少的树木来计算d100。这就是这个因素的作用 首先,我尝试将因子作为自己的列放入数据框架中。然后我想也许有一个类似查找表的东西会有所帮助,因为R表示n必须是一个数字。但我不知道如何创建查找函数。请参阅示例代码的最后一部分。或者在使用df$因子之前总结它会起作用吗 样本数据: 我指出了一些我不确定如何在R中编码的表达式,比如:“我不知道如何”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必须是一个数字。但我不知
# 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