Условный расчет столбцов в R - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть набор данных, подобный показанному ниже

library(tidyverse)
dat <- data.frame(col.1 = 1:16,
                  col.2 = c("B", "B", "B", "B", "B", "B", "A", "B", 
                            "A", "A", "B", "A", "A", "A", "A", "A"),
                  col.3 = c(30, 60, 75, 105, 40, 80, -20, 60, -20, -60, 40,
                            -40,-105,-20,-20,-45),
                  col.4 = c(39.34775, 31.66806, 28.57107, 28.43085, 29.30417, 36.21187,
                            40.29794, 40.70641, 65.85152, 66.85943, 69.26766, 67.24402,
                            74.85330, 79.17230, 78.75405, 64.47038))
dat

Я пытаюсь добраться до последнего столбца, который выглядит следующим образом:

dat.2 <- dat %>% 
  mutate(col.Final =  c(1180.43, 1900.08, 2142.83, 2985.24, 1172.17,
                        2896.95, -629.63, 2442.38, -655.37, -1966.11,
                        2770.71, -1460.48, -3833.76, -730.24, -730.24, 
                        -1643.04))

Пока я пыталсяиспользуя функцию mutate() для достижения этой точки.

dat.1 <- dat %>% 
  mutate(col.5 = col.3*col.4) %>% 
  mutate(col.6 = cumsum(col.3)) %>% 
  mutate(col.7 = if_else(col.2 == 'B', col.6, col.6 - col.3),
         col.8 = col.3/col.7)

Когда я пытаюсь добраться до последнего столбца, я не получаю те же результаты.

dat.1 %>% 
  mutate(col.9 = if_else(col.2 == 'A', col.8*lag(cumsum(col.5)), col.5))

Примечание: этоТот же расчет был успешно выполнен с использованием функции SUMIFS() в Excel.

Я пытаюсь получить те же результаты, что и с R.

Я видел некоторые вопросы и ответы для похожих постов, новсе еще застрял с окончательным расчетом.В Excel казалось, что итерация была выполнена для определенного условия, а затем было выполнено следующее условие.Хотя я не уверен, что было сделано с помощью Excel, думаю, как-то это возможно и с помощью R.Просто не могу понять, как это получить.

На этом этапе будет полезна любая помощь.

Обновление:

Значения для col.5и col.8 соответствует col.2:

col.2 = c("B", "B", "B", "B", "B", "B", "A", "B", 
          "A", "A", "B", "A", "A", "A", "A", "A")
col.5 <- c(1180.4325, 1900.0836, 2142.8302, 2985.2393, 1172.1668,
           2896.9496, -805.9588, 2442.3846, -1317.0304, -4011.5658,
           2770.7064, -2689.7608, -7859.5965, -1583.4460, -1575.0810, 
           -2901.1671)
col.8 <-c(1.00000000, 0.66666667, 0.45454545, 0.38888889, 0.12903226,
          0.20512821, -0.05128205, 0.13953488, -0.04651163, -0.14634146,
          0.10256410,-0.10256410, -0.30000000, -0.08163265, -0.08888889, 
          -0.21951220)

Проверка значений с помощью ручного расчета!

Расчеты с использованием col.5 & col.8

для "B"сверху:

1180.43 + 1900.08 + 2142.83 + 2985.24 + 1172.17 + 2896.95 = 12277.7020

для A после:

12277.7020 x -0.05128205 = -629.6266509 .... 1-е желаемое значение для A

для "B""после:

12277.720 - 629.6266509 = 11648.07535
11648.07535 + 2442.3846 = 14090.45995

для" A "после:

 14090.45995 x -0.04651163 = -655.37026 ... 2nd desired Value for A

для" A "после:

 14090.45995 - 655.37026 = 13435.08969
 13435.08969 x -0.14634146 = -1966.110641 ... 3rd desired value for A

и т. д ....

Надеюсь, это объясняет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...