gpt4 book ai didi

r - 计算每组从 0 开始的偏移累积总和

转载 作者:行者123 更新时间:2023-12-04 11:53:46 25 4
gpt4 key购买 nike

我的示例数据如下所示:

>         gros id nr_oriz
> 1: 23 1 1
> 2: 16 1 2
> 3: 14 1 3
> 4: 15 1 4
> 5: 22 1 5
> 6: 30 1 6
> 7: 25 2 1
> 8: 10 2 2
> 9: 13 2 3
> 10: 17 2 4
> 11: 45 2 5
> 12: 25 4 1
> 13: 15 4 2
> 14: 20 4 3
> 15: 20 4 4
> 16: 20 4 5

哪里 gros是每个土壤层的深度, id是个人资料编号和 nr_horiz是土壤层数。我需要创建两列:顶部和底部,其中顶部是地平线的上限,底部是下限。我们设法使用以下方法仅获得底部值:
topsoil$bottom<-ave(topsoil$gros,topsoil$id,FUN=cumsum)

但是对于最高值,我们需要以某种方式抵消每个 id 的数据。并计算从 0 开始且没有最后一个值的累积总和,如下例所示:
    gros id nr_oriz top bottom
1: 23 1 1 0 23
2: 16 1 2 23 39
3: 14 1 3 39 53
4: 15 1 4 53 68
5: 22 1 5 68 90
6: 30 1 6 90 120
7: 25 2 1 0 25
8: 10 2 2 25 35
9: 13 2 3 35 48
10: 17 2 4 48 65
11: 45 2 5 65 110
12: 25 4 1 0 25
13: 15 4 2 25 40
14: 20 4 3 40 60
15: 20 4 4 60 80
16: 20 4 5 80 100

是否有一个简单的解决方案,考虑到数据库非常大,我们无法手动完成(就像我们对本示例中的 top 列所做的那样)。

最佳答案

您可以使用 ave再次,但在“底部”列上并具有自定义功能:

topsoil$top <- ave(topsoil$bottom, topsoil$id, FUN=function(x) c(0,x[-length(x)]))

看起来您正在使用 data.table包,您可以修改代码以利用 data.table 的语法和性能。为了计算 bottom ,您只需执行以下操作:
topsoil[, bottom := cumsum(gros), by = id]

然后计算 top :
topsoil[, top := c(0L, bottom[-.N]), by = id]

或者,您可以像 @akrun's answer 所示的那样,一步一步地将它们包装起来。 .

关于r - 计算每组从 0 开始的偏移累积总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31540384/

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