使用R代码

时间:2016-05-30 08:34:30

标签: r variables

我有一个名为" dats"。

的数据集
 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

我想根据(y11 * y12,y12 * y13 ......等)计算一个新变量ynew =(yij-1 * yij)。我试过这样的方式:

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 个答案:

答案 0 :(得分:2)

我们可能只需乘以lag&#39; y&#39;按&#39; id&#39;

分组
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

答案 1 :(得分:2)

使用dplyr包中的rollapplyzoo

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