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

これは機能し、コントロールは、テストが真の場合は 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

パッケージ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)
于 2013-07-10T03:22:54.097 に答える