2016-05-30 3 views
0

"dats"という名前のデータセットがあります。Rコードを使用した条件変数

id y i j 
    1 0 1 1 
    1 0 1 2 
    1 0 1 3 
    2 1 2 1 
    2 1 2 2 
    2 1 2 3 

私は、に基づいて新たな変数ynew =(Yijを-1 * Yijを)計算したい(Y11の*のY12、Y12の*のY13を....のように)。

ynew <- NULL 

for(p in 1) 
    { 
    for (q in ni) 
     { 
     ynew[p,q] <- dats$y[dats$i==p & dats$j==q-1]*dats$y[dats$i==p & dats$j==q] 
     } 
    } 

ynewしかし、それはエラーを示す:私はこの方法で試してみました!

の予想される出力

id y i j ynew 
    1 0 1 1 NA 
    1 0 1 2 0 
    1 0 1 3 0 
    2 1 2 1 NA 
    2 1 2 2 1 
    2 1 2 3 1 

は誰も助けてもらえますか? TIA

答えて

2

たちは単に 'Y' は

library(data.table) 
setDT(dats)[, ynew := y * shift(y), by = id] 
dats 
# id y i j ynew 
#1: 1 0 1 1 NA 
#2: 1 0 1 2 0 
#3: 1 0 1 3 0 
#4: 2 1 2 1 NA 
#5: 2 1 2 2 1 
#6: 2 1 2 3 1 

またroll_prod

library(RcppRoll) 
setDT(dats)[, ynew := c(NA, roll_prod(y, 2)), by = id] 
dats 
# id y i j ynew 
#1: 1 0 1 1 NA 
#2: 1 0 1 2 0 
#3: 1 0 1 3 0 
#4: 2 1 2 1 NA 
#5: 2 1 2 2 1 
#6: 2 1 2 3 1 
+0

ありがとう。しかし、この出力は、私が "id"のサイズを50以上に増やしているときに合計結果が得られないときには出ません。 – Rudro88

+0

@ Rudo88入力データと予想される出力に基づいています。あなたのデータが異なる場合は、あなたの投稿で期待通りに変更してください – akrun

+0

ありがとうございました。私が知りたいのは、データのサイズを拡張すれば一般的なコードですか? – Rudro88

2

からdplyrrollapplyを使用して行うことができる 'ID' でグループ化されたのlagで乗算する必要があるかもしれませzooパッケージ

library(dplyr) 
library(zoo) 

dats %>% 
    group_by(id) %>% 
    mutate(ynew = c(NA, rollapply(y, 1, by = 2, prod))) 

#Source: local data frame [6 x 5] 
#Groups: id [2] 

#  id  y  i  j ynew 
# (int) (int) (int) (int) (dbl) 
#1  1  0  1  1 NA 
#2  1  0  1  2  0 
#3  1  0  1  3  0 
#4  2  1  2  1 NA 
#5  2  1  2  2  1 
#6  2  1  2  3  1 
関連する問題