首页 > 解决方案 > 如何将案例 ID 添加到列表中,直到它们的累积值达到 R 中的阈值?

问题描述

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

例如:

桌子:

编号: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")

标签: rfor-loopcumsum

解决方案


这行得通吗?

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

推荐阅读