在R中向上移动行

时间:2014-07-18 15:10:49

标签: r time-series

这是我数据的简单示例。

假设我得到以下数据

>x

  Year   a   b   c
  1962   1   2   3
  1963   4   5   6
   .     .   .   .
   .     .   .   .
  2001   7   8   9

我需要形成一个x的时间序列,其中7列包含以下变量:

   Year  a  lag(a)  b  lag(b)  c   lag(c)

我所做的是以下内容:

> x<-ts(x)              # converting x to a time series
> x<-cbind(x,x[,-1])    # adding the same variables to the time series without repeating the year column
> x

    Year   a   b   c  a   b   c
    1962   1   2   3  1   2   3
    1963   4   5   6  4   5   6
     .     .   .   .  .   .   .
     .     .   .   .  .   .   .
    2001   7   8   9  7   8   9

我需要将最后三列向上移动,以便给出a,b,c的滞后。然后我会重新安排它们。

2 个答案:

答案 0 :(得分:0)

X <- data.frame(
  a=1:100,
  b=2*(1:100),
  c=3*(1:100),
  laga=1:100,
  lagb=2*(1:100),
  lagc=3*(1:100),
  stringsAsFactors=FALSE)
##
Xts <- ts(X)
Xts[1:(nrow(Xts)-1),c(4,5,6)] <- Xts[2:nrow(Xts),c(4,5,6)]
Xts[nrow(Xts),c(4,5,6)] <- c(NA,NA,NA)
> head(Xts)
    a  b  c laga lagb lagc
[1,] 1  2  3    2    4    6
[2,] 2  4  6    3    6    9
[3,] 3  6  9    4    8   12
[4,] 4  8 12    5   10   15
[5,] 5 10 15    6   12   18
[6,] 6 12 18    7   14   21
##
> tail(Xts)
         a   b   c laga lagb lagc
[95,]   95 190 285   96  192  288
[96,]   96 192 288   97  194  291
[97,]   97 194 291   98  196  294
[98,]   98 196 294   99  198  297
[99,]   99 198 297  100  200  300
[100,] 100 200 300   NA   NA   NA

我不确定shift up你是否真的意味着将行向上移动1个位置(因为这意味着你使用滞后值而不是领先值),但这是另一个方向(“真正的”滞后值):

X2 <- data.frame(
  a=1:100,
  b=2*(1:100),
  c=3*(1:100),
  laga=1:100,
  lagb=2*(1:100),
  lagc=3*(1:100),
  stringsAsFactors=FALSE)
##
Xts2 <- ts(X2)
Xts2[2:nrow(Xts2),c(4,5,6)] <- Xts2[1:(nrow(Xts2)-1),c(4,5,6)]
Xts2[1,c(4,5,6)] <- c(NA,NA,NA)
##
> head(Xts2)
     a  b  c laga lagb lagc
[1,] 1  2  3   NA   NA   NA
[2,] 2  4  6    1    2    3
[3,] 3  6  9    2    4    6
[4,] 4  8 12    3    6    9
[5,] 5 10 15    4    8   12
[6,] 6 12 18    5   10   15
##
> tail(Xts2)
         a   b   c laga lagb lagc
[95,]   95 190 285   94  188  282
[96,]   96 192 288   95  190  285
[97,]   97 194 291   96  192  288
[98,]   98 196 294   97  194  291
[99,]   99 198 297   98  196  294
[100,] 100 200 300   99  198  297

答案 1 :(得分:0)

这是使用dplyr

的方法
df <- data.frame(
    a=1:10,
    b=21:30,
    c=31:40)

library(dplyr)

df %>% mutate_each(funs(lead(.,1))) %>% cbind(df, .)
#    a  b  c  a  b  c
#1   1 21 31  2 22 32
#2   2 22 32  3 23 33
#3   3 23 33  4 24 34
#4   4 24 34  5 25 35
#5   5 25 35  6 26 36
#6   6 26 36  7 27 37
#7   7 27 37  8 28 38
#8   8 28 38  9 29 39
#9   9 29 39 10 30 40
#10 10 30 40 NA NA NA

您可以使用colnames(df) <- c("a", "b", ...)

更改名称

正如@nrussel在他的回答中所说,你描述的是一个主要变量。如果您想要一个滞后变量,可以将我的答案中的lead更改为lag