Как вы суммируете последовательные значения в столбце и создаете новый столбец из этих суммированных значений?

Во фрейме данных я пытаюсь вычислить общую толщину через определенные интервалы в стратиграфическом столбце и создать новые значения этих полных толщин во фрейме данных. Я новичок в использовании 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
person Jay May    schedule 03.11.2019    source источник
comment
Всем огромное спасибо! Я очень ценю это!   -  person Jay May    schedule 12.11.2019


Ответы (3)


В этих альтернативах мы используем ввод, воспроизводимый в примечании в конце.

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) transform 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)

2б) или так:

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. Используя transform2 в пакете gsubfn, каждый вычисленный компонент может зависеть от любого из других, и он автоматически определит зависимости и выполнит вычисления в правильном порядке.

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)
person G. Grothendieck    schedule 03.11.2019

Вам нужна функция 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

Вот рабочий пример кода

person Aziz    schedule 03.11.2019

Для этого мы можем использовать пакет 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)
person www    schedule 03.11.2019