Сумма на основе двух флагов - PullRequest
0 голосов
/ 15 января 2020

Мне нужна твоя помощь. У меня есть данные с одним числовым полем c и двумя флагами. Я хочу суммировать число c, поданное на основе двух флагов. В приведенных ниже данных: я хочу рассчитать сумму между FLAG1 и FLAG2. Но когда FLAG2 равен TRUE, значение следующей строки FLAG1 должно быть установлено в TRUE, и перед тем, как значение FLAG2 будет истинным, значение FLAG следует рассматривать как False.

nf<-c(10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,180,190,200,210,220,230,240,250)
Flag1 <- c('FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE')
Flag2 <- c('FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE')


abc <- as.data.frame(cbind(Flag1,Flag2,nf))

Вывод, который я ищу, это: * сумма поля 300,910 и 1890.

60 + 70 + 80 + 90 = 300 100 + 110 + 120 + 130 + 140 + 150 + 160 После того, как значение второго флага равно TRUE, значение первого ряда следующего флага должно стать Значение true и любое последующее значение, установленное в флаге 1, должно иметь значение false.

пожалуйста, руководство.

С уважением, Рохит

1 Ответ

1 голос
/ 16 января 2020

Я не уверен, что это то, что вам нужно, но подумал, что это может быть полезно.

Во-первых, как упоминалось @akrun, TRUE и FALSE являются логическими векторами и не нуждаются быть заключенным в кавычки как строки. Для этого примера я преобразовал их в логические значения.

В этом решении используется tidyverse. Вы можете перевернуть значения Flag1 в предыдущих или последующих строках, как описано выше, используя lead и lag. Используя slice, вы можете начать свои суммы, начиная с первого TRUE в Flag1. Используя cumsum, вы можете нумеровать ваши группы, которые всегда заканчиваются на Flag2, являющимся TRUE.

nf<-c(10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250)

Flag1 <- c('FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE',
           'FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE')
Flag2 <- c('FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE',
           'FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE')

Flag1 <- Flag1 == 'TRUE'
Flag2 <- Flag2 == 'TRUE'

abc <- data.frame(Flag1,Flag2,nf)

library(tidyverse)

abc %>%
  mutate(Flag1 = if_else(lag(Flag2), TRUE, Flag1),
         Flag1 = if_else(lead(Flag2), FALSE, Flag1)) %>%
  slice(match(TRUE, Flag1):n()) %>%
  group_by(grp = cumsum(lag(Flag2, default = 0))) %>%
  summarise(sum = sum(nf))

# A tibble: 3 x 2
    grp   sum
  <dbl> <dbl>
1     0   300
2     1   910
3     2  1890
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...