Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-如果前x行与每一行相比具有相等或更小的值,则标识该行_R - Fatal编程技术网

R-如果前x行与每一行相比具有相等或更小的值,则标识该行

R-如果前x行与每一行相比具有相等或更小的值,则标识该行,r,R,此外,我现在必须检查前面的x行是否具有递减(或保持不变)值 我很难获得我期望的行为,即m1->m2,m2->m3,m3->m4的差异在m4中返回真/假。我想我的方向是正确的,我想可能是过滤器上的延迟是问题所在,但我无法使修改的checkfun在处理内部\外部revs、diff和NA的顺序以及rep语句后按预期工作 民间能否建议一个amendedcheckfun,其作用与checkfun相同,但行方向相反 library("plyr") df<-data.frame(ID=1,Month=1

此外,我现在必须检查前面的x行是否具有递减(或保持不变)值

我很难获得我期望的行为,即m1->m2,m2->m3,m3->m4的差异在m4中返回真/假。我想我的方向是正确的,我想可能是
过滤器上的延迟是问题所在,但我无法使
修改的checkfun
在处理内部\外部
rev
s、
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))
理想输出

   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

这里有一个函数,它应该做您想要做的事情

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))

由于每个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))

newcheckfun为什么不简单地使用
checkfun
以相反的顺序输入(例如,
checkfun(rev(Bal),3)
)?这主意不错,但会返回所有错误值。也许我误解了<代码>ddply(df,.(ID),transform,diff=c(diff(Bal),NA),check=checkfun(Bal,3),check2=amendedcheckfun(Bal,3),check3=checkfun(rev(Bal),3))
我很可能误解了你在找什么。这能满足你的需求吗:c(代表(NA,2),头部(或头部)(df$Bal,3),-2))。结果与你期望的不符,但取决于支票,这对我来说很奇怪。检查的第一、第六和第十一个值不应该是真的吗?我添加了一个“理想”输出,这可能会让每个人都更清楚。在您的描述中,您提到过渡m1->m2,m2->m3,m3->m4应该在m4中返回真/假。从理想输出的前2个值来看,如果没有足够的数据,那么返回的值应该是NA。那么,为什么理想输出的第三个值是真的而不是NA?
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
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))