R-如果前x行与每一行相比具有相等或更小的值,则标识该行
此外,我现在必须检查前面的x行是否具有递减(或保持不变)值 我很难获得我期望的行为,即m1->m2,m2->m3,m3->m4的差异在m4中返回真/假。我想我的方向是正确的,我想可能是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
过滤器上的延迟是问题所在,但我无法使修改的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))