2016-05-30 80 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

可能是我們需要的只是用的lag '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從進行分組乘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