Omr*_*tia 2 r cumulative-sum dplyr
我有以下数据框
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
Run Code Online (Sandbox Code Playgroud)
其中指出每个人(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
Run Code Online (Sandbox Code Playgroud)
但是此结果显然是错误的,因为我希望1的计数对应50%而不是29.4%。
怎么了 如何获得正确答案?
我们得到count'Count'的值,通过取'n'的累加和来创建'Cum',然后将其除以sum'n',然后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
Run Code Online (Sandbox Code Playgroud)
如果我们需要输出@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
Run Code Online (Sandbox Code Playgroud)