对于这个问题,我现在必须检查前 x 行的值是否减小(或保持不变)。
我无法获得我期望的行为,即 m1->m2,m2->m3,m3->m4 的差异在 m4 中返回 TRUE/FALSE。我认为我的方向是正确的,我认为可能是滞后的问题,但在摆弄了 inner\outer s、&的顺序和语句之后filter
,我无法按预期完成工作。amendedcheckfun
rev
diff
NA
rep
人们可以建议一个与行方向amendedcheckfun
相同checkfun
但在相反行方向上做的事情吗?
library("plyr")
df<-data.frame(ID=1,Month=1:15,Bal=seq(from=500, to=220, by=-20))
df$Bal[6] <- 505
df$Bal[11] <- 505
origcheckfun <- function(x,n) {
rev(filter(rev(c(diff(x) <= 0,NA)),rep(1,pmin(n,length(x)),sides=1))) == n }
amendedcheckfun <- function(x,n) {
rev(filter(c(diff(x) <= 0,NA),rep(1,pmin(n,length(x)),sides=1))) == n }
ddply(df,.(ID),transform,diff=c(diff(Bal) ,NA),check=checkfun(Bal,3),
check2=amendedcheckfun(Bal,3))
修正check2中的checkfun输出
ID Month Bal diff check check2
1 1 1 500 -20 NA NA
2 1 2 480 -20 TRUE NA
3 1 3 460 -20 TRUE TRUE # check2 correct
4 1 4 440 -20 FALSE TRUE
5 1 5 420 85 FALSE FALSE # check2 not correct - id=2:4 all decreases
6 1 6 505 -125 FALSE FALSE
7 1 7 380 -20 TRUE FALSE
8 1 8 360 -20 TRUE TRUE # check2 not correct - id=5 is increase
9 1 9 340 -20 FALSE TRUE # check2 correct
10 1 10 320 185 FALSE FALSE # check2 not correct - id=7:9 all decreases
11 1 11 505 -225 FALSE FALSE
12 1 12 280 -20 TRUE FALSE
13 1 13 260 -20 TRUE TRUE
14 1 14 240 -20 NA TRUE
15 1 15 220 NA NA NA # check2 not correct - should show TRUE
理想输出
ID Month Bal diff test
1 1 1 500 -20 NA
2 1 2 480 -20 NA
3 1 3 460 -20 NA
4 1 4 440 -20 TRUE
5 1 5 420 85 TRUE
6 1 6 505 -125 FALSE
7 1 7 380 -20 FALSE
8 1 8 360 -20 FALSE
9 1 9 340 -20 TRUE
10 1 10 320 185 TRUE
11 1 11 505 -225 FALSE
12 1 12 280 -20 FALSE
13 1 13 260 -20 FALSE
14 1 14 240 -20 TRUE
15 1 15 220 NA TRUE