【问题标题】:How do you sum consecutive values in a column and create a new column of those summed values?您如何对列中的连续值求和并创建这些求和值的新列?
【发布时间】:2019-11-03 14:06:16
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 非常感谢大家!我真的很感激!

标签: r


【解决方案1】:

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

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,计算的每个组件都可以依赖于任何其他组件,它会自动确定依赖关系并以正确的顺序执行计算。 p>

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)

【讨论】:

    【解决方案2】:

    你需要的函数是cumsum。顾名思义,它会创建累积总和。

    您需要先反转您的Thickness 数据(以便从底层开始),生成累积和,然后将其反转(以正确的顺序放回)。

    data$Top = rev( cumsum( rev(data$Thickness) ) )
    

    这将生成:

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

    Base 值只不过是向上移动的Top 值。所以你可以轻松做到:

    data$Base = c( data$Top[ 2:length(data$Top) ] , 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
    

    Here is a working example of the code

    【讨论】:

      【解决方案3】:

      我们可以使用dplyr 包来实现这一点。 lead 函数可以将数据前移。

      library(dplyr)
      
      dat2 <- dat %>%
        mutate(Top = rev(cumsum(rev(Thickness)))) %>%
        mutate(Base = lead(Top, default = 0))
      dat2
      #   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
      

      数据

      dat <- read.table(text = "Lithology  Thickness
           sand          4
            mud          1
           sand          5
            mud          3
            mud          5
           sand          2
         bottom          0",
                        header = TRUE, stringsAsFactors = FALSE)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 2011-08-31
        • 2015-11-26
        相关资源
        最近更新 更多