gpt4 book ai didi

r - 按组对大于当前值的值求和

转载 作者:行者123 更新时间:2023-12-05 08:49:40 26 4
gpt4 key购买 nike

我测量了不同地 block 中树木的基础面积。这是一个小例子,有两个地 block ,每个地 block 有 4 棵树:

Plot    Tree    BasalArea
1 1 4
1 2 5
1 3 7
1 4 3
2 1 4
2 2 6
2 3 9
2 4 5

在每个地 block 中,我想计算基础面积大于焦点树的树木的基础面积总和。

例如,地 block 1 中的树 1 的面积为 4。在该地 block 内,有 2 棵树的面积大于树 1:树 2 和树 3 的面积分别为 5 和 7。因此,树 1 的“BA_Larger”是 5 + 7 = 12。

同一地 block 中的树 2 的基础面积 = 5。在地 block 1 中,只有一棵树的面积大于树 2:树 3 的面积为 7。因此,树 2 的“BA_Larger”为 7。

最后,数据框应该是这样的:

Plot    Tree    BasalArea   BA_Larger
1 1 4 12
1 2 5 7
1 3 7 0
1 4 3 16
2 1 4 20
2 2 6 9
2 3 9 0
2 4 5 15

数据集非常大。我试图计算“BA_Larger”,但没有成功。非常感谢任何帮助。

最佳答案

使用 ave()base R 解决方案:

within(df, BA_Larger <- ave(BasalArea, Plot, FUN = function(x) sapply(x, function(y) sum(x[x > y]))))

使用 tidyverse 样式,您还可以使用 purrr 中的 map_int()map_dbl()

library(dplyr)
library(purrr)

df %>%
group_by(Plot) %>%
mutate(BA_Larger = map_int(BasalArea, ~ sum(BasalArea[BasalArea > .]))) %>%
ungroup()

输出

# # A tibble: 8 x 4
# Plot Tree BasalArea BA_Larger
# <int> <int> <int> <int>
# 1 1 1 4 12
# 2 1 2 5 7
# 3 1 3 7 0
# 4 1 4 3 16
# 5 2 1 4 20
# 6 2 2 6 9
# 7 2 3 9 0
# 8 2 4 5 15

数据

df <- structure(list(Plot = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Tree = c(1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L), BasalArea = c(4L, 5L, 7L, 3L, 4L,
6L, 9L, 5L)), class = "data.frame", row.names = c(NA, -8L))

关于r - 按组对大于当前值的值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63543800/

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