我有一个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
您对如何实现结果有任何建议吗?
提前谢谢。
答案 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")]