gpt4 book ai didi

r - 根据数据框中的其他值,使用 n 按组选择前 n 个值

转载 作者:行者123 更新时间:2023-12-05 06:47:27 26 4
gpt4 key购买 nike

我对 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'))

我已经找到了this回答一个看起来与我相似的问题,但它并没有太大帮助。

最佳答案

由于所有因素值在每个组中都相同,您可以选择任何一个因素值。

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

关于r - 根据数据框中的其他值,使用 n 按组选择前 n 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67122914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com