Size: a a a

R language and Statistical data analysis

2020 February 06

ИП

Иван Поздняков in R language and Statistical data analysis
Аве!
источник

AC

Andrey C. in R language and Statistical data analysis
Philipp Upravitelev
друзья, задачка на подумать

допустим, есть датасет с колонкой value.
мне надо разбить строки так, чтобы сумма value по этим строкам не превышала значение x. при этом как только она превышает значение x - начинается новая группа.
в строках могут быть значения больше х.

как это сделать?

по факту это кумулята с условием порога и перезапуском
how bout
dt <- data.table(x = rpois(500, 5))
threshold = 10
dt[,cum_x:=cumsum(x)]
dt[,x_gr:=cum_x%/%threshold]
dt
источник

ИП

Иван Поздняков in R language and Statistical data analysis
да я вот примерно так же сначала и сделал, но понял, что сумма должна каждый раз сбрасываться.
источник

VV

Vladimir Volokhonsky in R language and Statistical data analysis
Та же функция на цикле без рекурсии:
group_cumsum<-function(value,limit)
{
gr<-1
s<-0
group<-integer(length(value))
for (i in 1:length(value)) {
 s<-s+value[i]
 if (s>limit)  {s<-value[i]; gr<-gr+1}
 group[i]<-gr
}
group
}
источник

AC

Andrey C. in R language and Statistical data analysis
Иван Поздняков
да я вот примерно так же сначала и сделал, но понял, что сумма должна каждый раз сбрасываться.
так вот это целое от деления и дает тебе сброс
источник

VV

Vladimir Volokhonsky in R language and Statistical data analysis
Красиво с целым от деления!
источник

ИП

Иван Поздняков in R language and Statistical data analysis
Andrey C.
так вот это целое от деления и дает тебе сброс
Нет, часть числа, получается, идет в одну группу, другая часть - в другую.
источник

AC

Andrey C. in R language and Statistical data analysis
Иван Поздняков
Нет, часть числа, получается, идет в одну группу, другая часть - в другую.
э?
dt[1:10]     x cum_x x_gr  1: 7     7    0  2: 4    11    1  3: 7    18    1  4: 6    24    2  5: 4    28    2  6: 4    32    3  7: 9    41    4  8: 3    44    4  9: 4    48    4 10: 5    53    5
источник

AC

Andrey C. in R language and Statistical data analysis
я не понимаю, как сделать форматированный вывод тут =(
источник

ИП

Иван Поздняков in R language and Statistical data analysis
Допустим, х = 10. Вектор 7, 8, 4. Должно выйти 1, 2, 3, а так выйдет 1, 2, 2
источник

VV

Vladimir Volokhonsky in R language and Statistical data analysis
С остатком отделения получается, что число превышающее тоже попадает в первую группу.
источник

VV

Vladimir Volokhonsky in R language and Statistical data analysis
А надо, чтобы оно было началом следующей группы.
источник

VV

Vladimir Volokhonsky in R language and Statistical data analysis
Ну, я так понял задачу, что сумма не должна нигде превышаться.
источник

AC

Andrey C. in R language and Statistical data analysis
а, ну сдвиг на один тогда
источник

ИП

Иван Поздняков in R language and Statistical data analysis
Сдвиг тут не решит проблему
источник

VV

Vladimir Volokhonsky in R language and Statistical data analysis
dt[,.(sum_by_group=sum(x)),by=x_gr][,max(sum_by_group)]
источник

VV

Vladimir Volokhonsky in R language and Statistical data analysis
Групп получаается меньше, а сами они больше и превышают лимит.
источник

AC

Andrey C. in R language and Statistical data analysis
Иван Поздняков
Допустим, х = 10. Вектор 7, 8, 4. Должно выйти 1, 2, 3, а так выйдет 1, 2, 2
почему д.б. 1, 2, 3?
если вторая группа начинается на втором числе, то на третьем она становится больше порога, и должна начаться новая
источник

VV

Vladimir Volokhonsky in R language and Statistical data analysis
Кстати, вариант с рекурсией - не очень вариант, так как вызывает переполнение стэка уже на 10.000 строк.
источник

AC

Andrey C. in R language and Statistical data analysis
но косяк понял
источник