基于R

时间:2018-12-13 12:20:17

标签: r loops cumsum

我有以下数据集,我需要累计值和 总和,如果因子为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 :(得分:0)

反复尝试以下方法:

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

答案 1 :(得分:0)

使用tidyversedata.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

答案 2 :(得分:0)

如果您想使用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]
}
相关问题