Как создать промежуточную сумму столбца на основе других столбцов - PullRequest
1 голос
/ 26 апреля 2019

У меня есть df, который имеет два столбца bear_start_count и td_sell_setup.Используя эти два столбца, мне нужно потренироваться в другом столбце td_sell_count.

Условия для td_sell_count следующие:

Когда bear_start_count == 1 & td_sell_setup == 0, тогда td_sell_count == 1

после этого, когда bear_start_count == 0 и td_sell_setup == 1;td_sell_count = предыдущая строка td_sell_count + текущая строка td_sell_setup значение

* td_sell_count сбрасывается в 0, когда bear_start_count и td_sell_setup == 0

library(tidyverse)

df <- data.frame(
         bear_start_count = c(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                              0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                              0, 0, 0, 0, 0),
            td_sell_setup = c(1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
                              0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                              1, 1, 1, 1, 1),
            td_sell_count = c(0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0,
                              0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                              15, 16, 17, 18, 19, 20)
      )

Приведенный выше df дает как существующие столбцы, так и вычисленный столбец.

Любые идеи о том, как решить эту проблему

1 Ответ

2 голосов
/ 26 апреля 2019

Один из вариантов - создать группирующую переменную с rleid на основе столбцов 'bear_start_count', 'td_sell_setup', а затем проверить if значения paste d "10", "01" в группе , затем получите row_number() или else return 0 (реализовано с case_when)

library(data.table)
library(dplyr)
library(stringr)
out <- df %>% 
       mutate(newcol = str_c(bear_start_count, td_sell_setup)) %>% 
       group_by(grp = rleid(newcol %in% c("10", "01"))) %>% 
       mutate(td_sell_count1 =  case_when(all(c("10", "01") %in% newcol)
                     ~ row_number(), TRUE ~ 0L)) %>%
       ungroup %>%
       select(-grp, -newcol)

-проверка с ожидаемым выходом OP

all.equal(out$td_sell_count, out$td_sell_count1)
#[1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...