【问题标题】:R data.table cumulative sum functionR data.table 累积和函数
【发布时间】:2016-02-19 00:33:29
【问题描述】:

我创建了以下可重现的示例:

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 )))]

我的问题是 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 )]

这是否需要循环计算,因为每一列都依赖于另一列的结果? 谢谢。

感谢@Frank 的回答,根据下面的 cmets 更新示例并包含新代码:

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" ) ]

【问题讨论】:

  • @Arun 我投票结束,因为我不太清楚 OP 想要什么(没有投反对票)。
  • 大家好,感谢你们的 cmets,我对 R 比较陌生,所以我会全部接受。为了澄清这是一个大型数据集的简化示例,我使用 get() 的原因是我可以使用 ifelse 语句,例如 ifelse( get( Col2 ) &gt; get( Col4 ) &amp; get( Col6 ) &lt; get( Col8 ), 。如果有更好的方法请告诉我。
  • @user3740289 仅供参考,要获得所需的输出,请尝试跳过中间对象 Col_4 的创建并只执行 mydata.table[, Col_3*cumprod(1+Col_1*shift(Col_2=="A", type="lag", fill=FALSE))] (我忽略了 Arun 涵盖的 get 的问题;以及您的覆盖 Col_3。)要了解其工作原理,请尝试 ?cumprod?shift
  • 谢谢@Frank,虽然我收到了这个错误消息:'移位错误(Col_2 ==“A”,type =“lag”,fill = FALSE):未使用的参数(type =“滞后",填充 = FALSE)'
  • @user3740289 也许您没有在 CRAN (1.9.6) 上使用最新版本的 data.table,其中添加了 shift?否则,可能是与使用相同函数名的另一个包发生冲突,因此您可以尝试使用data.table::shift 代替shift

标签: r data.table cumsum


【解决方案1】:

要获得所需的输出,请尝试跳过创建中间对象 Col_4 并直接进行

mydata.table[, Col_3*cumprod(1 + Col_1*shift(Col_2 == "A", type = "lag", fill=FALSE))] 

要了解其工作原理,请尝试?cumprod?shift。您也可以分段运行,例如,

mydata.table[, shift(Col_2 == "A", type = "lag", fill = FALSE)] 

(我忽略了您在 cmets 中提到的 get 的问题;以及您对 Col_3 的覆盖。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2021-04-05
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多