【问题标题】:How to add the ID of cases to the list until their cumulative value reaches a threshold in R?如何将案例 ID 添加到列表中,直到它们的累积值达到 R 中的阈值?
【发布时间】:2020-11-13 17:58:26
【问题描述】:

我有一个有两列的表。第一个具有案例 ID,另一个具有价值。我想将 ID 添加到列表中,并且当累积值达到一个数字(比如说 500000)时,应该保存列表并且函数应该从它停止的地方继续直到结束。我怎样才能做到这一点?

例如:

表:

ID:1234 2345 3512 1353 1457 8756

值:5000 3000 498000 23000 485000 23000

输出:

第一名单:(1234、2345、3512) 第二名:(1353、1457) 第三名:(8756)

我希望它足够清楚。提前谢谢你。

数据作为复制和粘贴代码

ID <- scan(text = "1234 2345 3512 1353 1457 8756")
Value <- scan(text = "5000 3000 498000 23000 485000 23000")

【问题讨论】:

    标签: r for-loop cumsum


    【解决方案1】:

    这行得通吗?

    library(purrr)
    
    with(df, split(
      ID, 
      cumsum(c(0, head(purrr::accumulate(Value, ~if ((s <- .x + .y) > 500000) 0 else s), -1L)) == 0)
    ))
    

    df 看起来像这样

    > df
        ID  Value
    1 1234   5000
    2 2345   3000
    3 3512 498000
    4 1353  23000
    5 1457 485000
    6 8756  23000
    

    输出

    $`1`
    [1] 1234 2345 3512
    
    $`2`
    [1] 1353 1457
    
    $`3`
    [1] 8756
    

    【讨论】:

    • 如果我没有在“if”函数前删除“~”,显示“不匹配的左括号”,则会出现错误。当我删除“~”并运行代码时,它会给出一条错误消息: h(simpleError(msg, call)) 中的错误:在为函数“head”选择方法时评估参数“x”时出错:对象' .x' 未找到
    • 嗨@EkinKaplan,我无法重现您的错误。您可以发布您在问题中尝试过的代码吗?
    • 当然。 with(df, split( ID, cumsum(c(0, head(purrr::accumulate(Value, if ((s 500000) 0 else s), -1L)) == 0 ) ))
    • 嗨@EkinKaplan,我仍然无法重现您的问题。你能 1) 启动一个新的 rscript,2) 将上面编写的代码(带有 ~ 符号)粘贴到该 rscript,3) 运行该 rscript 中的代码,以及 4) 显示完整的错误消息(如果有)。
    猜你喜欢
    • 2021-04-10
    • 2020-02-08
    • 2018-07-12
    • 2021-03-26
    • 2020-03-30
    • 2018-07-04
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多