Как использовать cumsum-Lapply, когда нужен столбец i + 1? - PullRequest
5 голосов
/ 02 мая 2019

В настоящее время я работаю над довольно большим файлом, содержащим остановки / ходы нескольких машин (около 60) + их производство в течение длительного периода (более 60 000 строк).Остановки индексируются по «-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  

Моя цель - получить для каждого устройства новый столбец накопленного производства за остановку / ход (возможно, на новом 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         

Для одного столбца я могу получить желаемый результат, используя:

df<-as_tibble(df)%>%
 group_by(n1_stops) %>% 
 dplyr::mutate(n1_agprod= cumsum(n1_prod))

Но я не знаю, как обобщатьэто потому, что мне каждый раз нужен новый столбец для групп, и в настоящее время я не могу заменить имя столбца на индекс столбца ...

Знаете ли вы, как я могу управлять этим?

Ответы [ 2 ]

4 голосов
/ 02 мая 2019

Вы можете разделить на основе префикса имени каждого столбца и применить 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
1 голос
/ 02 мая 2019

Сначала мы можем разделить столбцы, заканчивающиеся "prod" и "stop", затем использовать mapply и ave до cumsum для каждой группы и создать новые столбцы.

prod_cols <- grep("prod$", names(df))
stop_cols <- grep("stops$", names(df))

df[paste0("agprod", 1:length(prod_cols))] <- 
    mapply(ave, df[prod_cols], df[stop_cols], MoreArgs = list(FUN = cumsum))


df
#                Date n1_prod n1_stops n2_prod n2_stops agprod1 agprod2
#1 2011-12-1300:00:00       2        1       0       -1       2       0
#2 2011-12-1301:00:00      10        1     -10       -1      12     -10
#3 2011-12-1302:00:00      24        1      -5       -1      36     -15
#4 2011-12-1303:00:00      25        1       0       -1      61     -15
#5 2011-12-1304:00:00      23        1      12        1      84      12
#6 2011-12-1305:00:00       0       -1      11        1       0      23
#7 2011-12-1306:00:00      -2       -1      21        1      -2      44
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...