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