2017-08-25 18 views
0

データフレーム内の変数に適用する関数を作成しようとしていますが、現在の観測から2日先のウィンドウで、その日付ウィンドウにVarDの値を変更します常に値1.日付を使用してデータフレームサブセットを含むIfelseステートメント

を取るデータフレームは、次のようになります。

VarA  VarB  Date   Diff VarD 
1   1  2007-04-09 NA  0 
1   1  2007-04-10 0  0 
1   1  2007-04-11 -2  1 
1   1  2007-04-12 0  1 
1   1  2007-04-13 2  0 
1   1  2007-04-14 0  0 
1   1  2007-04-15 -2  1 
1   1  2007-04-16 1  0 
1   1  2007-04-17 -4  1 
1   1  2007-04-18 0  1 
1   1  2007-04-19 0  1 
1   1  2007-04-20 0  1 

新しいデータフレームは、次のようになります。

VarA  VarB  Date   Diff VarD VarC 
1   1  2007-04-09 NA  0  0 
1   1  2007-04-10 0  0  0 
1   1  2007-04-11 -2  1  1 
1   1  2007-04-12 0  1  1 
1   1  2007-04-13 2  0  0 
1   1  2007-04-14 0  0  0 
1   1  2007-04-15 -2  1  1 
1   1  2007-04-16 1  0  0 
1   1  2007-04-17 -4  1  0 
1   1  2007-04-18 0  1  0 
1   1  2007-04-19 0  1  0 
1   1  2007-04-20 0  1  0 

私はトンを試してみました彼は次のコード:

db$VarC <- 0 

for (i in unique(db$VarA)) { 
for (j in unique(db$VarB)) { 
    for (n in 1 : lenght(db$Date)) { 
    if (db$VarD[n] == 0) {db$VarC[n] <- 0} 
    else { db$VarC[n] <- ifelse(0 %in% db[(db$Date >=n & db$Date < n+3,]$VarC, 1,0} 
} 
} 

しかし、私はVarCでわずか0を取得します。私はelseを使わないでコードをチェックしてうまくいきます。完全なコードが実行されている場合、rによってエラーはありません。私は問題がどこにあるかも知りません。

答えて

2

ここにいくつかの選択肢があります。最初のものは乱雑なインデックス作成を避けますが、最後の2つはパッケージを必要としません。

1)rollapplyこれはの3つの要素にローリング方式でVarC関数を適用します。 align = "left"は、xが機能VarCに、x[1]が現在の要素であり、x[2]が次であり、現在の要素がx[3]であり、すなわち現在の要素が最も左であると言います。 partial = TRUEには、利用可能な要素が3つもない場合(最後の要素と最後の要素の場合のように)、多くの要素が残っています。

> db 
    VarA VarB  Date Diff VarD VarC 
1  1 1 2007-04-09 NA 0 0 
2  1 1 2007-04-10 0 0 0 
3  1 1 2007-04-11 -2 1 1 
4  1 1 2007-04-12 0 1 1 
5  1 1 2007-04-13 2 0 0 
6  1 1 2007-04-14 0 0 0 
7  1 1 2007-04-15 -2 1 1 
8  1 1 2007-04-16 1 0 0 
9  1 1 2007-04-17 -4 1 0 
10 1 1 2007-04-18 0 1 0 
11 1 1 2007-04-19 0 1 0 
12 1 1 2007-04-20 0 1 0 

2)sapply以上からVarCを使用して:

library(zoo) 

VarC <- function(x) if (all(x[-1] == 1)) 0 else x[1] 
db$VarC <- rollapply(db$VarD, 3, VarC, partial = TRUE, align = "left") 

与え

n <- nrow(db) 
db$VarC <- sapply(1:n, function(i) VarC(db$VarD[i:min(i+2, n)])) 
又は nを使用する

3)とVarC上から:

db$VarC <- NA 
for(i in 1:n) db$VarC[i] <- VarC(db$VarD[i:min(i+2, n)]) 

注:再現可能な形で入力dbがある:それは完璧に動作

Lines <- "VarA  VarB  Date   Diff VarD VarC 
1   1  2007-04-09 NA  0  0 
1   1  2007-04-10 0  0  0 
1   1  2007-04-11 -2  1  1 
1   1  2007-04-12 0  1  1 
1   1  2007-04-13 2  0  0 
1   1  2007-04-14 0  0  0 
1   1  2007-04-15 -2  1  1 
1   1  2007-04-16 1  0  0 
1   1  2007-04-17 -4  1  0 
1   1  2007-04-18 0  1  0 
1   1  2007-04-19 0  1  0 
1   1  2007-04-20 0  1  0 " 
db <- read.table(text = Lines, header = TRUE) 
+0

おかげG.。私はまた、異なるVarAで試して、日付がない場合は、また働いた。最後の1つの質問:VarC関数のx [-1]はどういう意味ですか?再度、感謝します。 –

+0

'x [-1]'はその最初の要素を除いて 'x'です。 'x < - c(11、24、100);を試してください。 x [-1] ' –