需要i + 1列时如何使用cumsum-Lapply?

Ali*_*ere 5 group-by r lapply cumsum

我目前正在处理一个相当大的文件,其中包含多个机械师(大约60个)的停产/销存以及长期(超过6万行)的生产。停靠点以“ -1”索引,以“ 1”进行索引:

**Date                     n1_prod   n1_stops   n2_prod   n2_stops  n3_prod     

1  2011-12-13 00:00:00          2        1         0        -1        14                    
2  2011-12-13 01:00:00         10        1       -10        -1        24                   
3  2011-12-13 02:00:00         24        1        -5        -1        23                       
4  2011-12-13 03:00:00         25        1         0        -1        22                      
5  2011-12-13 04:00:00         23        1        12         1        13                      
6  2011-12-13 05:00:00          0       -1        11         1        17                      
7  2011-12-13 06:00:00         -2       -1        21         1        18  
Run Code Online (Sandbox Code Playgroud)

我的目的是为每个设备获得一个新的列,显示每个停止/运行的累计产量(可能在新的df上)。例如,对于设备n°1,它将是:

**Date                     n1_prod   n1_stops   n1_agprod   
1  2011-12-13 00:00:00          2        1         2                          
2  2011-12-13 01:00:00         10        1        12                          
3  2011-12-13 02:00:00         24        1        36                             
4  2011-12-13 03:00:00         25        1        61                             
5  2011-12-13 04:00:00         23        1        84                            
6  2011-12-13 05:00:00          0       -1         0                               
7  2011-12-13 06:00:00         -2       -1        -2         
Run Code Online (Sandbox Code Playgroud)

对于一列,我可以使用以下方法获得期望的结果:

df<-as_tibble(df)%>%
 group_by(n1_stops) %>% 
 dplyr::mutate(n1_agprod= cumsum(n1_prod))
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将其归纳,因为每次组时我都需要一个不同的列,并且我目前无法用列索引替换该列的名称...

你知道我该怎么办吗?

Sot*_*tos 4

您可以根据每个列名的前缀进行拆分并应用cumsum那里,即

sapply(split.default(df[-1], sub('_.*','',names(df[-1]))), 
                                          function(i) ave(i[[1]], i[[2]], FUN = cumsum))
#     n1  n2
#[1,]  2   0
#[2,] 12 -10
#[3,] 36 -15
#[4,] 61 -15
#[5,] 84  12
#[6,]  0  23
#[7,] -2  44
Run Code Online (Sandbox Code Playgroud)