3

次の x (6 は現在の計画ですが、これは変更される可能性があります) の残高が同じままか、毎月減少するかを調べようとしています。

今月の値から開始し、翌月の値と比較して、同じままか減少したかなどを確認するように、Excel でこれを行いました。

=IF(AND(H3<=H2,H4<=H3,H5<=H4,H6<=H5,H7<=H6,H8<=H7),1,0)

これは最初の探索の一部であったため、最も柔軟で洗練された式ではありません。すべてをよりクリーンで再現性の高いものにするために、代わりに計算を R に入れたいと思います。

これは、何ヶ月にもわたる複数の ID の私のデータのような基本的なデータセットです。

rbind(data.frame(ID=1,Month=1:11,Bal=seq(from=500, to=300, by=-20)),
  data.frame(ID=2,Month=1:10,Bal=rep(200,10)),
  data.frame(ID=3,Month=1:11,Bal=seq(from=300, to=500, by=20)))

行レベルで生データに対して計算するもの、または ddply 内で機能するものを持つことは、理想的なソリューションのバリエーションです。

私はまだRにかなり慣れていないので、これにはエレガントな解決策があると確信していますが、実際にはわかりません。誰かがきちんとした解決策を持っているか、解決策にたどり着くために調査すべき重要な用語の方向性を教えてくれますか?

4

2 に答える 2

3

正しく理解できたかどうかわかりません:

checkfun <- function(x,n) {
   rev(filter(rev(c(diff(x) <= 0,NA)),rep(1,n),sides=1)) == n
}

この関数は、連続する値の差を計算し、それらが <= 0 であるかどうかをチェックします。フィルターは、条件を満たす次の n 個の差の数を合計します。この数は最終的に n と比較され、それらすべてが条件を満たしているかどうかが確認されます。(revのみを使用するため、片側フィルターを使用できます。)

DF$Bal[6] <- 505 #to not only have equal differences
library(plyr)
#example with 3 next values
ddply(DF,.(ID),transform,check=checkfun(Bal,3))
#    ID Month Bal check
# 1   1     1 500  TRUE
# 2   1     2 480  TRUE
# 3   1     3 460 FALSE
# 4   1     4 440 FALSE
# 5   1     5 420 FALSE
# 6   1     6 505  TRUE
# 7   1     7 380  TRUE
# 8   1     8 360  TRUE
# 9   1     9 340    NA
# 10  1    10 320    NA
# 11  1    11 300    NA
# 12  2     1 200  TRUE
# 13  2     2 200  TRUE
# 14  2     3 200  TRUE
# 15  2     4 200  TRUE
# 16  2     5 200  TRUE
# 17  2     6 200  TRUE
# 18  2     7 200  TRUE
# 19  2     8 200    NA
# 20  2     9 200    NA
# 21  2    10 200    NA
# 22  3     1 300 FALSE
# 23  3     2 320 FALSE
# 24  3     3 340 FALSE
# 25  3     4 360 FALSE
# 26  3     5 380 FALSE
# 27  3     6 400 FALSE
# 28  3     7 420 FALSE
# 29  3     8 440 FALSE
# 30  3     9 460    NA
# 31  3    10 480    NA
# 32  3    11 500    NA
于 2013-07-03T16:39:45.640 に答える