2

我需要做的是测试 a 的前 n 行(比如 5 表示一个不错的整数)data.frame。这对一个人来说真的很容易,它在哪里

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

这有效,如果测试为真,则 Control 填充 1,如果测试为假,则填充 0。

但是,我想在过去将其扩展到更多,我尝试使用这样的嵌套 for:

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)))},"

尝试用一些括号填充它会产生以下稍微不同的错误:

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 方法(我还是语言的新手!)的任何帮助。

4

1 回答 1

3

我认为你需要rollapplyzoo包中。但是不清楚你是如何定义你的循环的,因为你使用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)
于 2013-07-10T03:22:54.097 回答