【问题标题】:find sum of numbers in a column up till a specified number查找列中数字的总和,直到指定的数字
【发布时间】:2016-10-30 19:58:25
【问题描述】:

我正在尝试查找列的最高累积行数,直到指定数量。所以如果我有这个数据集

df <- data.frame(x = rnorm(26, 10, 2))

我希望从顶部开始的行数总和为 100。我尝试过使用以下变体:

df %&gt;% top_n(6)

但这不起作用。有没有我想念的可以轻松做到这一点的功能?

这种情况的用例是,如果我有一个频率列,它给出了在执行 group_by 和 desc 函数后观察出现在数据集中的百分比,然后我想要所有观察的顶部,比如 15%。

提前致谢。

【问题讨论】:

  • 查看cumsum
  • df %&gt;% arrange(desc(x)) %&gt;% filter(cumsum(x) &lt; 100).

标签: r group-by dplyr percentage


【解决方案1】:

您可以使用cumsum

sum(cumsum(df$x)<100)
#[1] 10

或者使用Reduce:

sum(Reduce('+', df$x, accumulate = T)<100)
#[1] 10

数据

set.seed(100)
df <- data.frame(x = rnorm(26, 10, 2))

【讨论】:

    【解决方案2】:

    诀窍是使用 cumsum 函数,然后缩小框架 到 cumsum

    这样就可以了:

    df <- data.frame(x = rnorm(26, 10, 2))
    df$accum <- cumsum(df$x)
    df
    nrow(df[df$accum<100,])
    

    结果:

              x     accum
    1  10.045870  10.04587
    2   6.626029  16.67190
    3   9.585552  26.25745
    4   3.311654  29.56911
    5  12.247780  41.81689
    6   7.973587  49.79047
    7  12.194685  61.98516
    8  12.415279  74.40044
    9   8.617609  83.01805
    10 10.339062  93.35711
    11 11.976633 105.33374
    12  7.301745 112.63549
    13  9.247254 121.88274
    14  5.697414 127.58015
    15  9.721602 137.30176
    16 12.371765 149.67352
    17 10.231773 159.90529
    18 10.474578 170.37987
    19 13.562808 183.94268
    20  7.419556 191.36224
    21  7.613043 198.97528
    22  9.416050 208.39133
    23 10.047952 218.43928
    24  9.788021 228.22730
    25 10.709967 238.93727
    26  8.766313 247.70358
    
    10
    

    【讨论】:

    • 我会认为第 11 行是他正在寻找的答案。
    • 好点。在这种情况下,它需要将 1 添加到 nrows,因为下一个值(如果存在)将是答案。
    猜你喜欢
    • 2022-08-20
    • 2023-01-07
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多