gpt4 book ai didi

r - 如何对列中的连续值求和并创建这些求和值的新列?

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

在数据框中,我试图计算地层列中某些间隔的总厚度,并在数据框中创建这些总厚度的新列。我是使用 r 的新手,我正在努力解决如何将一列中的连续值相加。

任何帮助或见解将不胜感激。甚至推荐阅读 Material 或帮助页面。

我正在尝试计算地层柱的特定床的顶部和底部。本质上,是地层柱中特定间隔的总厚度。我有每张床的厚度,我想计算顶部和底部相对于整个柱子底部的位置。我一直在努力想出一个解决方案,我觉得我根本不知道足够的函数和命令来让我编写能够满足我需要的代码。我也认为我可能需要创建一个函数,以便做我需要的事情。

这是我开始使用的数据。岩性或岩石类型,以及每个床层或岩石类型的总厚度。最后一行是统计列的绝对底数,因此没有厚度。

Lithology  Thickness
sand 4
mud 1
sand 5
mud 3
mud 5
sand 2
bottom 0

我希望做的是创建两个新列,在其中我计算每种岩石类型的高度/顶部和每种岩石类型的底部,最终得到如下所示的数据框。

我想添加/求和厚度以计算每个岩性的顶部和底部,引用底部。

所以,为了计算中间砂层的顶部,我想将包括中间砂层在内的所有先前岩性的厚度相加。然后为了计算基础,我想将除中间砂之外的所有先前岩性的厚度相加。我想对每一种岩性都这样做。

Lithology  Thickness Top Base
sand 4 20 16
mud 1 16 15
sand 5 15 10
mud 3 10 7
mud 5 7 2
sand 2 2 0
bottom 0 0 0

非常感谢您的帮助,感谢您的宝贵时间!

最佳答案

在这些替代方案中,我们使用在末尾注释中可重复显示的输入。

1) 范围内 底数是厚度的总和减去到该点的厚度,我们可以使用 cumsum 计算。顶部是加上当前的厚度。没有使用任何包。

within(DF, {
Base <- sum(Thickness) - cumsum(Thickness)
Top <- Base + Thickness
})

给予:

  Lithology Thickness Top Base
1 sand 4 20 16
2 mud 1 16 15
3 sand 5 15 10
4 mud 3 10 7
5 mud 5 7 2
6 sand 2 2 0
7 bottom 0 0 0

2) 变换 Top 是总厚度减去到该点的厚度,当前厚度除外。除了最后一个学期外,基本相同。没有使用任何包。

transform(DF, 
Top = sum(Thickness) - cumsum(Thickness) + Thickness,
Base = sum(Thickness) - cumsum(Thickness))

2a) 为了利用之前的计算,我们可以迭代transform:

transform(
transform(DF, Top = sum(Thickness) - cumsum(Thickness) + Thickness),
Base = Top - Thickness)

2b) 或者这样做:

Base <- with(DF, sum(Thickness) - cumsum(Thickness))
transform(DF, Top = Base + Thickness, Base = Base)

3) dplyr 使用 dplyr,每个组件都可以使用左侧已经完成的计算,因此可以编写:

library(dplyr)

DF %>%
mutate(Top = sum(Thickness) - cumsum(Thickness) + Thickness,
Base = Top - Thickness)

4) gsubfn 使用 gsubfn 包中的 transform2 计算的每个组件都可以依赖于任何其他组件,它会自动确定依赖关系并在正确的顺序。

library(gsubfn)

transform2(DF,
Top = Base + Thickness,
Base = sum(Thickness) - cumsum(Thickness))

注意

Lines <- "Lithology  Thickness
sand 4
mud 1
sand 5
mud 3
mud 5
sand 2
bottom 0"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)

关于r - 如何对列中的连续值求和并创建这些求和值的新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58680936/

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