Рассчитать условную накопленную сумму - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующие данные:

N=seq(1:18)
Pre=c(0.5, 0.4, 0.7, 0.9, 0.6, 0.3, 0.7, 0.8, 0.6, 0.5, 0.4, 0.7, 0.9, 0.6, 0.3, 0.7, 0.8, 0.6)
df1=data.frame(N, Pre)

E=c(3.1, 2.9, 4.4)
Category=c(22,35,36)
df2=data.frame(E, Category)

Я хочу создать два новых столбца в df1 (cumsum и category)

Значения в столбце cumsumбудет накапливаться до тех пор, пока значение не станет равным или меньшим, чем значение df2$E, когда оно станет больше, cumsum начнется снова.В столбце category значение будет 22,35 или 36 и т. Д.

Результат будет

enter image description here

Это короткий пример, мне нужно сделать это с очень большими фреймами данных.

1 Ответ

0 голосов
/ 21 января 2019

Чтобы получить Category столбец, мы могли бы cut cumsum значение Pre и определить breaks как cumsum из E из df2 и labels как соответствующее значение Category , Теперь мы можем использовать это значение Category в качестве переменной группировки и принимать cumsum из Pre значений в каждой группе, используя ave.

df1$Category <- cut(cumsum(df1$Pre), breaks = c(0, cumsum(df2$E)), 
                                    labels = df2$Category)

df1$Cumsum <- ave(df1$Pre, df1$Category, FUN = cumsum)


df1
#    N Pre Category Cumsum
#1   1 0.5       22    0.5
#2   2 0.4       22    0.9
#3   3 0.7       22    1.6
#4   4 0.9       22    2.5
#5   5 0.6       22    3.1
#6   6 0.3       35    0.3
#7   7 0.7       35    1.0
#8   8 0.8       35    1.8
#9   9 0.6       35    2.4
#10 10 0.5       35    2.9
#11 11 0.4       36    0.4
#12 12 0.7       36    1.1
#13 13 0.9       36    2.0
#14 14 0.6       36    2.6
#15 15 0.3       36    2.9
#16 16 0.7       36    3.6
#17 17 0.8       36    4.4
#18 18 0.6     <NA>    0.6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...