Если я правильно понимаю, столбцы VORDEN_PREVENT*
обозначают продажи в последующие дни. ОП спрашивает, в какой день совокупная сумма продаж превышает заданную threshold
. Кроме того, ОП хочет видеть цифры продаж, которые суммируются до порога.
Предлагаю решить этот тип вопросов в длинном формате, где столбцы можно рассматривать как данные.
1. melt()
/ dcast()
library(data.table)
threshold <- 3000L
long <- melt(setDT(DT), id.var = "SEC")
long[, value := c(value[1L], diff(pmin(cumsum(value), threshold))), by = SEC]
dcast(long[value > 0], SEC ~ variable)
SEC VORDEN_PREVENT1 VORDEN_PREVENT2 VORDEN_PREVENT3
1: 2484628 1500 1328 172
2: 2491884 1500 1500 NA
3: 2521158 1500 1500 NA
4: 2548370 1500 1257 243
5: 2580994 1500 1500 NA
6: 2670164 1500 1500 NA
2. gather()
/ spread()
library(tidyr)
library(dplyr)
threshold <- 3000L
DT %>%
gather(, , -SEC) %>%
group_by(SEC) %>%
mutate(value = c(value[1L], diff(pmin(cumsum(value), threshold)))) %>%
filter(value >0) %>%
spread(key, value)
# A tibble: 6 x 4
# Groups: SEC [6]
SEC VORDEN_PREVENT1 VORDEN_PREVENT2 VORDEN_PREVENT3
<int> <int> <int> <int>
1 2484628 1500 1328 172
2 2491884 1500 1500 NA
3 2521158 1500 1500 NA
4 2548370 1500 1257 243
5 2580994 1500 1500 NA
6 2670164 1500 1500 NA
3. apply()
С основанием R:
DT[, -1] <- t(apply(DT[, -1], 1, function(x) c(x[1L], diff(pmin(cumsum(x), threshold)))))
DT
SEC VORDEN_PREVENT1 VORDEN_PREVENT2 VORDEN_PREVENT3 VORDEN_PREVENT4 VORDEN_PREVENT5
1 2484628 1500 1328 172 0 0
2 2491884 1500 1500 0 0 0
3 2521158 1500 1500 0 0 0
4 2548370 1500 1257 243 0 0
5 2580994 1500 1500 0 0 0
6 2670164 1500 1500 0 0 0
Данные
library(data.table)
DT <- fread("
SEC VORDEN_PREVENT1 VORDEN_PREVENT2 VORDEN_PREVENT3 VORDEN_PREVENT4 VORDEN_PREVENT5
2484628 1500 1328 2761 3003 2803
2491884 1500 1500 1169 2813 1328
2521158 1500 2813 1328 2761 3003
2548370 1500 1257 2595 1187 1837
2580994 1500 5057 2624 2940 2731
2670164 1500 1874 1218 2791 2892",
data.table = FALSE)