【问题标题】:Cumulative sum based on factor on R基于 R 因子的累积和
【发布时间】:2018-12-13 12:20:16
【问题描述】:

我有以下数据集,我需要累积值和 sum,如果因子为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    

提前致谢。

【问题讨论】:

    标签: r loops cumsum


    【解决方案1】:

    如果你想坚持使用 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]
    }
    

    【讨论】:

      【解决方案2】:

      反复尝试类似的方法:

      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
      

      【讨论】:

      • 感谢您的回复。我不知道为什么。但我的“辅助”只返回 30 行,而数据集有 33 行。
      【解决方案3】:

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

      【讨论】:

      • 感谢您的回复。但我无法加载 tidyverse 库,因为我的 R 工作室没有找到“避风港”包。我尝试安装它,但也没有成功。问候
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多