【问题标题】:Cumulative percentages in RR中的累积百分比
【发布时间】:2018-09-08 02:34:19
【问题描述】:

我有以下数据框

d2
# A tibble: 10 x 2
  ID Count
<int> <dbl>
  1     1
  2     1
  3     1
  4     1
  5     1
  6     2
  7     2
  8     2
  9     3
 10     3

这说明每个人 (ID) 有多少计数。

我想计算每个计数的累积百分比:1 - 50%,最多 2:80%,最多 3:100%。 我试过了

> d2 %>% mutate(cum = cumsum(Count)/sum(Count))
# A tibble: 10 x 3
  ID   Count     cum
 <int> <dbl>    <dbl>
   1     1   0.05882353
   2     1   0.11764706
   3     1   0.17647059
   4     1   0.23529412
   5     1   0.29411765
   6     2   0.41176471
   7     2   0.52941176
   8     2   0.64705882
   9     3   0.82352941
  10     3   1.00000000

但这个结果显然是不正确的,因为我预计 1 的计数对应于 50% 而不是 29.4%。

这里有什么问题?如何获得正确答案?

【问题讨论】:

  • 请显示您的预期输出?
  • 我不确定为什么问题被否决,而问题的答案却被投了赞成票。可能应该添加适当的 cmets 以进行否决。
  • 这个问题没有明确说明实际结果应该是什么样子,并且没有以易于使用的形式提供示例数据。
  • 我不知道结果应该是什么样子,正如我在上面写的那样,我知道 50%、80% 和 100% 会发生什么

标签: r dplyr cumulative-sum


【解决方案1】:

我们得到'Count'的count,通过将'n'的累积和除以'n'的sum来创建'Cum',然后right_join与原始数据

d2 %>% 
 count(Count) %>% 
 mutate(Cum = cumsum(n)/sum(n)) %>% 
 select(-n) %>% 
 right_join(d2) %>%
 select(names(d2), everything())
# A tibble: 10 x 3
#      ID Count   Cum
#   <int> <int> <dbl>
# 1     1     1 0.500
# 2     2     1 0.500
# 3     3     1 0.500
# 4     4     1 0.500
# 5     5     1 0.500
# 6     6     2 0.800
# 7     7     2 0.800
# 8     8     2 0.800
# 9     9     3 1.00 
#10    10     3 1.00 

如果我们需要@LAP 提到的输出

d2 %>%
   mutate(Cum = row_number()/n())
#   ID Count Cum
#1   1     1 0.1
#2   2     1 0.2
#3   3     1 0.3
#4   4     1 0.4
#5   5     1 0.5
#6   6     2 0.6
#7   7     2 0.7
#8   8     2 0.8
#9   9     3 0.9
#10 10     3 1.0

【讨论】:

  • 这个结果是c(0.2000000 0.4000000 0.6000000 0.8000000 1.0000000 0.6666667 1.3333333 2.0000000 1.5000000 3.0000000),什么时候应该结束
  • Op 希望每行向上计数 0.1,就像将每一行视为 10% 的数据一样,无论 Count 的值如何。
  • 我很确定 OP 只是想要像 0.1, 0.2, 0.3, ..., 1.0 这样的东西作为累积向量。
【解决方案2】:

一个选项可以是:

library(dplyr)
d2 %>%
  group_by(Count) %>%
  summarise(proportion = n()) %>%
  mutate(Perc = cumsum(100*proportion/sum(proportion))) %>%
  select(-proportion)
# # A tibble: 3 x 2
# Count  Perc
# <int> <dbl>
# 1     1  50.0
# 2     2  80.0
# 3     3 100.0

【讨论】:

    【解决方案3】:

    这行得通:

    d2 %>%
      mutate(cum = cumsum(rep(1/n(), n())))
    
       ID Count cum
    1   1     1 0.1
    2   2     1 0.2
    3   3     1 0.3
    4   4     1 0.4
    5   5     1 0.5
    6   6     2 0.6
    7   7     2 0.7
    8   8     2 0.8
    9   9     3 0.9
    10 10     3 1.0
    

    【讨论】:

    • 在 OP 的帖子I would expect that the count of 1 would correspond to 50% rather than 29.4%.
    • 是的,因为在他的尝试中,所有1 加起来为0.29(他的输出的第 5 行)而不是 0.5(我的输出的第 5 行)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多