gpt4 book ai didi

r - 根据尚不存在的列创建新列

转载 作者:行者123 更新时间:2023-12-03 16:53:41 26 4
gpt4 key购买 nike

我有以下数据集:

DT <- fread("   df1 df2
1 8
2 9
3 10
4 11
5 12")

我想新建一个专栏 df3第一个值等于 100,然后是 lag(df3, 1) * (1 + df2) .所以最终输出将是:
df1 df2     df3
1 1 8 100
2 2 9 1000
3 3 10 11000
4 4 11 132000
5 5 12 1716000

我试过运行 DT[,df3 := lag(df3, 1) * (1 + df2)]但因为 df3尚不存在,所以我收到一个错误。

最佳答案

我将之前的答案留在下面,因为它取得了一些成功,但我忽略了使用 cumprod 会快得多。 :

DT$df3 <-  100 * cumprod(c(0,DT$df2[-1])+1)        # base R
DT[, df3:= 100 * cumprod(c(0,df2[-1])+1)] # data.table
DT %>% mutate(df3 = 100 * cumprod(c(0,df2[-1])+1)) # tidyverse (only dplyr here)

我们计算 df2+1 的累积乘积,忽略第一个元素并以 1 开头,然后乘以 100 .

以前的回答 Reduce :

这对 Reduce来说是个好工作,我们使用的函数是简单的乘法,然后我们确保:
  • 添加 1df2并忽略第一个值。
  • 累积结果 ( accumulate = TRUE )

  • 代码:
    DT$df3 <- Reduce(`*`,DT$df2[-1]+1,init = 100,accumulate = TRUE)
    DT
    # df1 df2 df3
    # 1: 1 8 100
    # 2: 2 9 1000
    # 3: 3 10 11000
    # 4: 4 11 132000
    # 5: 5 12 1716000

    这适用于基础 R , 与 data.table 一起使用更惯用的语法可以按照@jogo 的建议写:
    DT[, df3:=Reduce('*', df2[-1]+1, init = 100,accumulate = TRUE)]

    为了完整起见,这将是 tidyverse道路:
    library(tidyverse)
    DT %>% mutate(df3 = accumulate(df2[-1]+1,`*`,.init = 100))

    关于r - 根据尚不存在的列创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50699826/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com