0

大きなデータフレームがあります。各行には、特定の日付のデータがあります。次の列グループには株価があります。各列は 1 つの株式を表します。次に、在庫列ごとに 1 つのオフセット列があります。現在の行をオフセット量だけオフセットする必要があります。次に、列の最初のグループで見つかった価格 (ただし、現在はオフセット行を使用) を列の最後のグループに配置します。これは NA として始まります。

たとえば、行 1、列 3 の値は 1 であるため、最初の行を 1 オフセットする必要があります。これにより、行 2 が得られます。行 2、列 1 にある価格 p1 を取得する必要があります。値は 2 です。値 2 は行 1、列 5 に配置されます。

理論的には二重ループで問題を解決しましたが、コードはどうしようもなく遅くなりました。ループを1つ解消することができました。誰かが残りのループをなくすのを手伝ってくれませんか?

以下は、私のコードと、コード実行前後のデータ フレームです。サンプルでは、​​日付は不要なので省略しています。

p1 = 1:1000000
p2 = 11:1000010
of1 = c(rep(1, 100000), rep(2, 800000), rep(0, 100000) )
of2 = c(rep(2,100000),rep(1,800000), rep(0, 100000) )
DF1 = data.frame(p1 = p1, p2 = p2, of1 = of1, of2 = of2)
DF1$newPrice1 = rep(NA, 1000000)
DF1$newPrice2 = rep(NA, 1000000)
head(DF1)



p1 p2 of1 of2 newPrice1 newPrice2
1  1 11   1   2        NA        NA
2  2 12   1   2        NA        NA
3  3 13   1   2        NA        NA
4  4 14   1   2        NA        NA
5  5 15   1   2        NA        NA
6  6 16   1   2        NA        NA
for(j in 1:2) {
DF1[j+4] = DF1[DF1[,j+2] + row(DF1)[,j], j]
}

head(DF1)

  p1 p2 of1 of2 newPrice1 newPrice2
1  1 11   1   2         2        13
2  2 12   1   2         3        14
3  3 13   1   2         4        15
4  4 14   1   2         5        16
5  5 15   1   2         6        17
6  6 16   1   2         7        18
4

1 に答える 1

0
DF1$np1 <- DF1$p1[seq_along(DF1$p1) + DF1$of1]
DF1$np2 <- DF1$p2[seq_along(DF1$p2) + DF1$of2]

identical(DF1$np1, DF1$newPrice1)
#[1] TRUE

identical(DF1$np2, DF1$newPrice2)
#[1] TRUE
于 2013-09-21T18:58:46.380 に答える