我需要做的是测试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方法(我还是语言新手!)非常受欢迎。
答案 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)