重塑R中的时间序列

时间:2014-12-15 13:39:07

标签: r

我有一个data.frame,如下所示

   Values
1  16.50
2  16.53
3  16.48
4  16.38
5  16.16
6  16.10
7  16.21
8  16.50

我需要创建一个新的数据框,其中包含每个值,同一行中的前2条记录,例如:

 line #1: 16.50, 16.53, 16.48
 line #2: 16.53, 16.48, 16.38

您对如何实现结果有任何建议吗?

提前谢谢。

3 个答案:

答案 0 :(得分:5)

尝试

library(dplyr)
df %>%
    mutate(Col1=lead(Values,1), Col2=lead(Values,2))
# Values  Col1  Col2
#1  16.50 16.53 16.48
#2  16.53 16.48 16.38
#3  16.48 16.38 16.16
#4  16.38 16.16 16.10
#5  16.16 16.10 16.21
#6  16.10 16.21 16.50
#7  16.21 16.50    NA
#8  16.50    NA    NA

更新

或者你可以试试

n <- 3
m1 <- matrix(df$Values, nrow=nrow(df)+1, ncol=n)[-nrow(df)+1,]
m1
#     [,1]  [,2]  [,3]
#[1,] 16.50 16.53 16.48
#[2,] 16.53 16.48 16.38
#[3,] 16.48 16.38 16.16
#[4,] 16.38 16.16 16.10
#[5,] 16.16 16.10 16.21
#[6,] 16.10 16.21 16.50
#[7,] 16.50 16.50 16.53
#[8,] 16.50 16.53 16.48

数据

df <- structure(list(Values = c(16.5, 16.53, 16.48, 16.38, 16.16, 16.1, 
16.21, 16.5)), .Names = "Values", class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))

答案 1 :(得分:5)

您可以使用基础R中的embed功能:

embed(DF$Values, 3L)[, 3:1]
#       [,1]  [,2]  [,3]
# [1,] 16.50 16.53 16.48
# [2,] 16.53 16.48 16.38
# [3,] 16.48 16.38 16.16
# [4,] 16.38 16.16 16.10
# [5,] 16.16 16.10 16.21
# [6,] 16.10 16.21 16.50

答案 2 :(得分:3)

您可以定义辅助函数

lagfunc <- function(x, y) unname(cbind(y, sapply(seq_len(x), function(x) c(tail(y, -x), rep(NA, x)))))

然后运行它

n <- 2
lagfunc(n, df$Values)
#       [,1]  [,2]  [,3]
# [1,] 16.50 16.53 16.48
# [2,] 16.53 16.48 16.38
# [3,] 16.48 16.38 16.16
# [4,] 16.38 16.16 16.10
# [5,] 16.16 16.10 16.21
# [6,] 16.10 16.21 16.50
# [7,] 16.21 16.50    NA
# [8,] 16.50    NA    NA

或使用data.table

library(data.table)
setDT(df)[, shift(Values, 0:n, type = "lead")]