使用しているfor()
データセット全体が非常に大きく、実行に永遠に時間がかかるため、Rでループを使用せずに解決したいトリッキーな問題。次のデータを想像してみてください。
df_z <- data.frame(z_index = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4),
z = c(800, 800, 800, 310, 310, 310, 763, 763, 763, 3621, 3621),
paired_type = c("A", "B", "C", "A", "C", "F", "A", "B", "D", "C", "F"),
paired_amount = c(0, 1768, 3973, 40, 100, 22, 461, 0, 1499, 10817, 0))
これはショー4つの異なるz
量(800
、310
、763
および3621
)。これらのそれぞれについて、私は持っているそれぞれの量の数、持っているpaired_type
- 、A
、B
、C
などを私は徐々に「支出」は、各行を通過したいと思いz
まで、ペアの量を減らすことに金額をz_amount
に減少しました0
。このプロセスは、offset_typeすなわちの順に行われる必要があるA
最初の、そしてB
、その後C
、など
そうするためにz_index
例えば= 2、Iで始まるz = 310
、私は上の40「過ごす」したいのですがpaired_type
A
、他100
にpaired_type
B
、別22
のをpaired_type
C
して私を残し、148
最後に残されました。
スプレッドシートで行うのは非常に簡単です。
しかし、それをRコードの一部に変換する方法は私には明らかではありません...
追加する必要があります:後でzの量を知る必要があるだけでなく、ペアになっている各量(つまり、スプレッドシートの最後の列)も知る必要があります。
誰か助けてもらえますか?dplyr
ベースのソリューションは特に歓迎します(私はdplyr
かなりよく話します)
ありがとうございました。
これにアプローチする1つの方法は次のとおりです。
library(dplyr)
df_z %>%
group_by(z_index) %>%
mutate(z_after_offset = pmax(0, cumsum(if_else(row_number() == 1, z, 0) - paired_amount)),
z_after = min(z_after_offset),
paired_amount_after = pmax(0, paired_amount - lag(z_after_offset, default = first(z))))
# A tibble: 11 x 7
# Groups: z_index [4]
z_index z paired_type paired_amount z_after_offset z_after paired_amount_after
<dbl> <dbl> <fct> <dbl> <dbl> <dbl> <dbl>
1 1 800 A 0 800 0 0
2 1 800 B 1768 0 0 968
3 1 800 C 3973 0 0 3973
4 2 310 A 40 270 148 0
5 2 310 C 100 170 148 0
6 2 310 F 22 148 148 0
7 3 763 A 461 302 0 0
8 3 763 B 0 302 0 0
9 3 763 D 1499 0 0 1197
10 4 3621 C 10817 0 0 7196
11 4 3621 F 0 0 0 0
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加