将ifelse测试应用于以前的值?

时间:2013-07-10 03:08:23

标签: r

我需要做的是测试data.frame的前n行(比如5为一个漂亮的整数)。这对于一个人来说非常简单,只有一个

for (i in 1:nrow(data)){
ifelse(((data$V1[i]>(mean(data$V1)+2*sd(data$V1))) & 
(data$V1[i-1]>(mean(data$V1)+2*sd(data$V1)))),Control[i,1]<-1,Control[i,1]<-0)
}

如果测试为真,则控制充满1,如果为假则为0。

但是,我想在过去将它扩展到更多,我试图用嵌套的方式做到这样:

for (i in 1:nrow(data$V1)){ifelse((data$V1[i]>(mean(data$V1)+sd(data$V1))) &
(for (j in 1:4){(data$V1[(i-j)]>(mean(data$V1)+sd(data$V1)))},
Control[i,1]<-1,Control[i,1]<-0)}

这会产生以下错误(为简单起见,我使用单个矢量值测试,称为test):

Error: unexpected ',' in "for (i in 1:length(test)){ifelse((test[i]>(mean(test)+sd(test))) & (for (j in 1:4){(test[(i-j)]>(mean(test)+sd(test)))},"

尝试用一些parens填充它会产生以下略有不同的错误:

Error: unexpected ')' in "for (i in 1:length(test)){ifelse((test[i]>(mean(test)+sd(test))) & (for (j in 1:4){(test[(i-j)]>(mean(test)+sd(test))))"

test的定义如下:

test <- c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 8, 8, 7, 7)

对我的方法有任何帮助,或者更有效的R方法(我还是语言新手!)非常受欢迎。

1 个答案:

答案 0 :(得分:3)

我认为您需要来自rollapply包的zoo。但是,您使用data后,如何定义循环并不清楚? Control和你在测试对象中给出错误....在这里我检查当前值和4个先前值是否都小于某个值(异常值)。这里不需要使用ifelse,因为条件不是矢量。

test <- c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
          4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
          4, 4, 4, 4, 8, 8, 7, 7)
library(zoo)
V <- mean(test)+2*sd(test)
rollapply(test,5,function(x)if(all(x>V)) 1 else 0)