Накопительная сумма, основанная на факторе по R - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть следующий набор данных, и мне нужно накапливать значение и сумму, если коэффициент равен 0, а затем положить накопленную сумму, когда я нашел коэффициент! = 0.

Я пыталсяниже, но это не сработало.

for(i in dataset$Variable.1) {

  ifelse(dataset$Factor == 0, 
     dataset$teste <- dataset$Variable.1 + i, 
     dataset$teste <- dataset$Variable.1) 
  i<- dataset$Variable.1
  print(i)
}

Есть идеи?

Ниже приведен пример набора данных.Я хочу получить столбец «Результат».

На реальном у меня также есть отрицательный коэффициент (-1).

     Date       Factor  Variable.1  Result
1  03/02/2018      0       0.75   0.75
2  04/02/2018      0       0.75   1.50
3  05/02/2018      1       0.96   2.46
4  06/02/2018      1       0.76   0.76
5  07/02/2018      0       1.35   1.35
6  08/02/2018      1       0.70   2.05
7  09/02/2018      1       2.02   2.02
8  10/02/2018      0       0.00   0.00
9  11/02/2018      0       0.00   0.00
10 12/02/2018      0       0.20   0.20
11 13/02/2018      0       0.13   0.33
12 14/02/2018      0       1.64   1.97
13 15/02/2018      0       0.03   2.00
14 16/02/2018      1       0.51   2.51
15 17/02/2018      1       0.00   0.00
16 18/02/2018      0       0.00   0.00
17 19/02/2018      0       0.83   0.83
18 20/02/2018      1       0.42   1.25
19 21/02/2018      1       0.17   0.17
20 22/02/2018      1       0.97   0.97
21 23/02/2018      0       0.92   0.92
22 24/02/2018      0       0.00   0.92
23 25/02/2018      0       0.00   0.92
24 26/02/2018      1       0.19   1.11
25 27/02/2018      1       0.87   0.87
26 28/02/2018      1       0.85   0.85
27 01/03/2018      1       1.95   1.95
28 02/03/2018      1       0.54   0.54
29 03/03/2018      1       0.00   0.00
30 04/03/2018      0       0.00   0.00
31 05/03/2018      0       1.17   1.17
32 06/03/2018      1       0.25   1.42
33 07/03/2018      1       1.45   1.45    

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Возможность использования tidyverse и data.table:

df %>%
 mutate(temp = ifelse(Factor == 1 & lag(Factor) == 1, NA, 1), #Marking the rows after the first 1 in "Factor" as NA
        temp = ifelse(!is.na(temp), rleid(temp), NA)) %>% #Run length along non-NA values
 group_by(temp) %>% #Grouping by run length
 mutate(Result = ifelse(!is.na(temp), cumsum(Variable.1), Variable.1)) %>% #Cumulative sum of desired rows
 ungroup() %>%
 select(-temp) #Removing the redundant variable

   Date       Factor Variable.1 Result
   <chr>       <int>      <dbl>  <dbl>
 1 03/02/2018      0      0.750  0.750
 2 04/02/2018      0      0.750  1.50 
 3 05/02/2018      1      0.960  2.46 
 4 06/02/2018      1      0.760  0.760
 5 07/02/2018      0      1.35   1.35 
 6 08/02/2018      1      0.700  2.05 
 7 09/02/2018      1      2.02   2.02 
 8 10/02/2018      0      0.     0.   
 9 11/02/2018      0      0.     0.   
10 12/02/2018      0      0.200  0.200
0 голосов
/ 13 декабря 2018

Если вы хотите придерживаться цикла for, вы можете попробовать этот код:

DF$Result <- NA
prev <- 0
for(i in seq_len(nrow(DF))){
  DF$Result[i] <- DF$Variable.1[i] + prev
  if(DF$Factor[i] == 1)
    prev <- 0
  else
    prev <- DF$Result[i]
}
0 голосов
/ 13 декабря 2018

Итеративно, попробуйте что-то вроде:

a=as.data.frame(cbind(Factor=c(0,0,1,1,0,1,1,
                 rep(0,3),1),Variable.1=c(0.75,0.75,0.96,0.71,1.35,0.7,
                                          0.75,0.96,0.71,1.35,0.7)))
Result=0
aux=NULL
for (i in 1:nrow(a)){
  if (a$Factor[i]==0){
    Result=Result+a$Variable.1[i]
    aux=c(aux,Result)
  } else{
    Result=Result+a$Variable.1[i]
    aux=c(aux,Result)
    Result=0
  }
}
a$Results=aux
a
   Factor Variable.1 Results
1       0       0.75    0.75
2       0       0.75    1.50
3       1       0.96    2.46
4       1       0.71    0.71
5       0       1.35    1.35
6       1       0.70    2.05
7       1       0.75    0.75
8       0       0.96    0.96
9       0       0.71    1.67
10      0       1.35    3.02
11      1       0.70    3.72
...