我有一个大数据框。每行都有特定日期的数据。下一组列有股票价格。每列代表一个股票。然后我有偏移列,每个库存列一个。我必须用偏移量来抵消当前行。然后我将最后一组列中的第一组列中的价格(但现在使用偏移行)中的值设置为NA。
例如,第1行col 3中的值为1,所以我需要将第一行偏移1.这给了我第2行。我需要得到第2行中的价格p1,col 1.该值为2.然后将值2放入第1行第5列。
我理论上用双循环解决了这个问题,但代码却无可救药地慢了。我能够消除一个循环。有人可以帮我消除剩余的循环吗?
下面是我的代码以及代码运行之前和之后的数据框。请注意,在示例中,我省略了不需要的日期。
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
答案 0 :(得分: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