-1

所以我在 R 中有 2 个数据集:表 1 和表 2。

这些是 2 个 .CSV 文件,具有相同的第一列名称,称为日期。然而,大多数日期是不同的,但有些是相同的。

我想要做的是匹配两个表中相同的日期列中的单元格,然后从包含该单元格的那一行,我想返回它之前的五行和它之后的五行在 10不同的表。所以每一行都转到一个不同的新输出表。

基本上我想在之后对每个第 i 行表进行回归,并在该表中使用其他列。

我在考虑使用 head() 和 tail() 但我无法弄清楚从哪里开始的索引部分..

谢谢你。这是一个简单的例子。当将表 1 中的第 3 行与表 2 中的第 1 行匹配时,我将如何在匹配行下方获取表 1 中的 3 行。

>table 1
>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

>table 2
>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
4

1 回答 1

0

使用您提供的示例数据:

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 的相邻匹配项tablex使用 的第一列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

结果是一个列表,其中每个元素都被命名为NeighXor ,分别表示下方或上方的Neigh_X相邻行。默认情况下有 11 个元素,如果您只想要 10 个,请忽略,它代表与指示的行完全匹配的行。XXNeigh0

您可以将结果保存在列表对象中,例如L <- getneighbors(table1, mydates),并使用 访问每个数据框L[["Neigh3"]]

于 2013-09-01T17:41:53.447 回答