use*_*289 0 r cumsum data.table
我创建了以下可重现的示例:
library(data.table)
Col_1 <- 0.05
Col_2 <- c( "B", "A", "C", "B", "C", "A", "C", "B", "B", "A" )
Col_3 <- 1000
Col_4 <- ""
data <- data.frame( Col_1, Col_2, Col_3, Col_4 )
mydata.table <- as.data.table( data )[ , list( Col_1, Col_2, Col_3, Col_4 ) ]
Col1 <- "Col_1"; Col2 <- "Col_2"; Col3 <- "Col_3"; Col4 <- "Col_4"
mydata.table[, (Col4) := ifelse( get( Col2 ) == "A" , get( Col1 ) * get( Col3 ), "0" ) ]
mydata.table[ , (Col3) := cumsum( c( 1000, head( Col4, -1 )))]
Run Code Online (Sandbox Code Playgroud)
我的问题是Col3没有正确计算cumsum并且在1000处保持静态.我已经从本网站上的其他答案调整了我的代码,但需要一点帮助.我希望Col3从1000开始,然后累计添加Col4(滞后一行).
我想输出显示以下内容:
Col_1 <- 0.05
Col_2 <- c( "B", "A", "C", "B", "C", "A", "C", "B", "B", "A")
Col_3 <- c( 1000.0, 1000.0, 1050.0, 1050.0, 1050.0, 1050.0, 1102.5, 1102.5, 1102.5, 1102.5 )
Col_4 <- c( 0, 50.0, 0, 0, 0, 52.5, 0, 0, 0, 55.1 )
good_data <- data.frame( Col_1, Col_2, Col_3, Col_4 )
gooddata.table <- as.data.table( good_data )[ , list( Col_1, Col_2, Col_3, Col_4 )]
Run Code Online (Sandbox Code Playgroud)
这是否需要在循环中计算,因为每列依赖于另一列的结果?谢谢.
根据@Frank的回答,根据以下评论更新示例并包含新代码:
library(data.table)
Col_1 <- 0.05
Col_2 <- c( "B", "A", "C", "B", "C", "A", "C", "B", "B", "A" )
Col_3 <- 1000
Col_4 <- 0
mydata.table <- data.table(Col_1, Col_2, Col_3, Col_4)
Col1 <- "Col_1"; Col2 <- "Col_2"; Col3 <- "Col_3"; Col4 <- "Col_4"
mydata.table[, (Col3) := Col_3*cumprod(1+Col_1*shift(Col_2=="A", type="lag", fill=FALSE))]
mydata.table[, (Col4) := ifelse( get( Col2 ) == "A" , get( Col1 ) * get( Col3 ), "0" ) ]
Run Code Online (Sandbox Code Playgroud)
要获得所需的输出,请尝试跳过中间对象的创建Col_4并执行操作
mydata.table[, Col_3*cumprod(1 + Col_1*shift(Col_2 == "A", type = "lag", fill=FALSE))]
Run Code Online (Sandbox Code Playgroud)
要了解其工作原理,请尝试?cumprod和?shift.您也可以分段运行它,例如,
mydata.table[, shift(Col_2 == "A", type = "lag", fill = FALSE)]
Run Code Online (Sandbox Code Playgroud)
(我忽略了你get在评论中提到的问题;以及你的覆盖Col_3.)
| 归档时间: |
|
| 查看次数: |
1635 次 |
| 最近记录: |