0

对于这个问题,我现在必须检查前 x 行的值是否减小(或保持不变)。

我无法获得我期望的行为,即 m1->m2,m2->m3,m3->m4 的差异在 m4 中返回 TRUE/FALSE。我认为我的方向是正确的,我认为可能是滞后的问题,但在摆弄了 inner\outer s、&的顺序和语句之后filter,我无法按预期完成工作。amendedcheckfunrevdiffNArep

人们可以建议一个与行方向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
4

2 回答 2

1

这是一个应该做你想做的功能

amendedcheckfun <- function(x, n){
    c(rep(NA, n-1), sapply(n:length(x), function(i, x, n) {all(diff(x[(i-n+1):i]) <= 0)}, x=x, n=n))
}

ddply(df, .(ID), transform, diff = c(diff(Bal), NA), check2 = amendedcheckfun(Bal, 4))

请注意,这里的第二个参数amendedcheckfun是 4,对应于要检查的连续值的数量。

您的示例的输出是

ID Month Bal diff check2
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
于 2013-07-08T11:28:57.747 回答
0

由于每个 ID 的观察数量不同以及 sapply 无法扩展到超过 70k 多个记录的困难,我逐渐减少了它,直到我遇到了 package zoo 中的 rollapply 函数。

它仍然不是快得惊人,但是:

newcheckfun<- function(x,n) {rollapply(x,n,min,fill = NA,partial=1,align="right")}

df<-ddply(df,.(ID),transform
          ,diffs=c(0,diff(Bal)<=0)
          ,movcheck=newcheckfun(c(0,diff(Bal)<=0),3))
于 2013-07-09T15:09:08.820 回答