【问题标题】:R - I don't understand why my code generates a count rather than a sumR - 我不明白为什么我的代码会生成计数而不是总和
【发布时间】:2019-10-17 13:46:01
【问题描述】:

我有一个包含 10,000 个值的列表,看起来像这样

      Points
1    118
2    564
3     15
4    729
5     49
6    614

调用列表 t1 并运行 sum(t1>quantile(t(t1),0.8)) 我希望得到列表中大于第 80 个分位数的值的总和,但我真正得到的是所有的计数(而不是总和)价值。

【问题讨论】:

  • 这是什么编程语言?
  • 对不起,语言是R

标签: r list count sum


【解决方案1】:

试试这个:

sum(t1[t1>quantile(t(t1),0.8), ])

要查看差异检查t1>quantile(t(t1),0.8),然后检查t1[t1>quantile(t(t1),0.8), ]

一个是逻辑向量,如果值大于 80% 分位数,则包含 TRUE(分别为 1),否则为零。 另一个是 t1 在该逻辑向量处进行评估,因此仅返回大于 80% 分位数的值

【讨论】:

    【解决方案2】:

    t1>quantile(t(t1),0.8) 是一个布尔值,即 TRUE/FALSE 值序列(您可以轻松检查)。因此,该向量的sumTRUE 值的出现次数,即满足您指定条件的个体的数量。

    【讨论】:

    • 谢谢,但有什么解决办法?
    • 解决方案是:sum(t1[t1>quantile(t(t1),0.8)])。通过这样做,您首先过滤 t1 以仅保留那些大于给定阈值的个体,然后在第二步中计算它们的值的总和。
    【解决方案3】:

    这是一个例子:

    set.seed(123)
    df <- data.frame(Point = rnorm(10000))
    sum(df$Point > quantile(df$Point, 0.8))
    

    第二行返回布尔向量 (TRUE/FALSE) 的总和,因此您得到计数(TRUE 出现的次数)。使用

    sum(df$Point[df$Point > quantile(df$Point, 0.8)])
    

    得到你想要的。

    【讨论】:

      【解决方案4】:

      您可以使用 ifelse 函数,如果 t1 高于您的阈值,它将添加 t1,否则添加 0

      sum(ifelse(t1>quantile(t(t1),0.8),t1,0))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        • 2020-04-20
        • 2014-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-02
        相关资源
        最近更新 更多