连续乘法同列前值

Continuous multiplication same column previous value

我有问题。 我有以下数据框。

1 2
NA 100
1.00499 NA
1.00813 NA
0.99203 NA

两列。在第二列中,除了起始值之外,只有 NA。我想通过将第 2 列的第一个值乘以第 1 列的第二个值 (100* 1.00499) 来填充第 2 列的第一个 NA。第 2 列的第 3 个值应该是第 2 列中的第 2 个新创建值与第 1 列中的第 3 个值的乘积,依此类推。这样最后 NA 就会被值替换。

这两个来源帮助我理解了如何引用不同的行。但是在这两种情况下,新列都是 created.I 不想要的。我想填写已经存在的第 2 列。

Use a value from the previous row in an R data.table calculation

https://statisticsglobe.com/use-previous-row-of-data-table-in-r

谁能帮帮我?

提前致谢。

示例代码

library(quantmod)
data.N225<-getSymbols("^N225",from="1965-01-01", to="2022-03-30", auto.assign=FALSE, src='yahoo') 
data.N225[c(1:3, nrow(data.N225)),]

data.N225<- na.omit(data.N225)
N225 <- data.N225[,6]


N225$DiskreteRendite= Delt(N225$N225.Adjusted)
N225[c(1:3,nrow(N225)),]

options(digits=5)
N225.diskret <- N225[,3]
N225.diskret[c(1:3,nrow(N225.diskret)),]

N225$diskretplus1 <- N225$DiskreteRendite+1
N225[c(1:3,nrow(N225)),]

library(dplyr)
N225$normiert <-"Value"
N225$normiert[1,] <-100
N225[c(1:3,nrow(N225)),]

N225.new <- N225[,4:5]
N225.new[c(1:3,nrow(N225.new)),]

这是在 R studio 中创建数据框的代码。

a <- c(NA, 1.0050,1.0081, 1.0095, 1.0016,0.9947)
b <- c(100, NA, NA, NA, NA, NA)
c<- data.frame(ONE = a, TWO=b)

for 循环 怎么样?

(我将为您的数据框使用 dat 而不是 c 以避免与函数 c() 混淆)。

for (row in 2:nrow(dat)) {
        if (!is.na(dat$TWO[row-1])) {
                dat$TWO[row] <- dat$ONE[row] * dat$TWO[row-1]
        }
}

这意味着: 对于从第二行到末尾的每一行,如果前一行的TWO不是缺失值,则计算本行的TWO,乘以当前行的ONETWO 来自上一行。

输出:

#>      ONE      TWO
#> 1     NA 100.0000
#> 2 1.0050 100.5000
#> 3 1.0081 101.3140
#> 4 1.0095 102.2765
#> 5 1.0016 102.4402
#> 6 0.9947 101.8972

reprex package (v2.0.1)

于 2022-04-28 创建

我很想阅读 dplyr 解决方案!

您可以使用 cumprod 作为累积产品

transform(
    df,
    TWO = cumprod(c(na.omit(TWO),na.omit(ONE)))
)

产生

     ONE      TWO
1     NA 100.0000
2 1.0050 100.5000
3 1.0081 101.3140
4 1.0095 102.2765
5 1.0016 102.4402
6 0.9947 101.8972

数据

> dput(df)
structure(list(ONE = c(NA, 1.005, 1.0081, 1.0095, 1.0016, 0.9947
), TWO = c(100, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA,
-6L))