使用您提供的示例数据:
table1 <- read.table(header=TRUE,text="
Date price1 price2 price3
11/02/13 4.4 4.22 4.12
11/04/13 4.23 4.09 4.10
12/01/13 4.01 4.27 4.14
12/02/13 4.1 4.23 4.16
12/02/13 4.65 4.23 4.17
11/01/13 4.4 4.22 4.12
11/07/13 4.23 4.09 4.10
12/09/13 4.01 4.27 4.14
12/12/13 4.1 4.23 4.16
12/15/13 4.65 4.23 4.17
")
table2 <- read.table(header=TRUE,text="
Date price1 price2 price3
12/01/13 2.4 2.22 9.12
08/04/13 4.23 7.09 6.10
12/01/13 1.01 6.27 6.14
12/08/13 6.1 3.23 4.16
12/05/13 4.65 2.23 3.17
11/02/13 4.4 4.22 4.12
07/04/13 4.23 4.09 4.10
09/01/13 4.01 4.27 4.14
01/02/13 4.1 4.23 4.16
11/05/13 4.65 4.23 4.17
")
首先保存匹配的日期,如下所示:
mydates <- merge(table1, table2, by="Date")$Date
现在编写一个辅助函数来从给定表中获取一些指定的日期及其相邻行:
getneighbors <- function(table, x, neigh=5){
r <- -neigh:neigh
lines <- which(table[,1] %in% x)
o <- outer(lines, r, `+`)
a <- apply(o, 2, pmin, nrow(table))
a <- apply(a, 2, pmax, 1)
L <- lapply(seq(ncol(a)), function(j)table[a[,j],])
names(L) <- gsub("-","_",paste0("Neigh",r))
L
}
此函数创建一个数据帧列表,其中每个数据帧具有 in 的相邻匹配项table
(x
使用 的第一列table
)。使用 指定要获取的邻居数neigh
,默认为 5(上下)。
请注意,简单地通过加法或减法计算的邻居可能位于无效的行号,因此调用apply(..., pmin)
and apply(..., pmax)
。我们假设第 0 行或负数的邻居实际上是第一行,超出表大小的行的邻居将被最后一行替换。
考虑到这一点,会有一些重复,特别是对于小样本数据:
> getneighbors(table1, mydates)
$Neigh_5
Date price1 price2 price3
1 11/02/13 4.4 4.22 4.12
1.1 11/02/13 4.4 4.22 4.12
$Neigh_4
Date price1 price2 price3
1 11/02/13 4.4 4.22 4.12
1.1 11/02/13 4.4 4.22 4.12
$Neigh_3
Date price1 price2 price3
1 11/02/13 4.4 4.22 4.12
1.1 11/02/13 4.4 4.22 4.12
$Neigh_2
Date price1 price2 price3
1 11/02/13 4.4 4.22 4.12
1.1 11/02/13 4.4 4.22 4.12
$Neigh_1
Date price1 price2 price3
1 11/02/13 4.40 4.22 4.12
2 11/04/13 4.23 4.09 4.10
$Neigh0
Date price1 price2 price3
1 11/02/13 4.40 4.22 4.12
3 12/01/13 4.01 4.27 4.14
$Neigh1
Date price1 price2 price3
2 11/04/13 4.23 4.09 4.10
4 12/02/13 4.10 4.23 4.16
$Neigh2
Date price1 price2 price3
3 12/01/13 4.01 4.27 4.14
5 12/02/13 4.65 4.23 4.17
$Neigh3
Date price1 price2 price3
4 12/02/13 4.1 4.23 4.16
6 11/01/13 4.4 4.22 4.12
$Neigh4
Date price1 price2 price3
5 12/02/13 4.65 4.23 4.17
7 11/07/13 4.23 4.09 4.10
$Neigh5
Date price1 price2 price3
6 11/01/13 4.40 4.22 4.12
8 12/09/13 4.01 4.27 4.14
结果是一个列表,其中每个元素都被命名为NeighX
or ,分别表示下方或上方的Neigh_X
相邻行。默认情况下有 11 个元素,如果您只想要 10 个,请忽略,它代表与指示的行完全匹配的行。X
X
Neigh0
您可以将结果保存在列表对象中,例如L <- getneighbors(table1, mydates)
,并使用 访问每个数据框L[["Neigh3"]]
。