Reputation: 1466
I have a dataframe as the following:
Member Category Total
1001 1 5
1001 2 4
1001 3 9
1003 1 7
1003 2 5
1003 3 2
1005 1 2
1005 3 5
I need to get:
Member Category Total Average
1001 1 5 0.27
1001 2 4 0.22
1001 3 9 0.5
1003 1 7 0.5
1003 2 5 0.35
1003 3 2 0.15
1005 1 2 0.28
1005 3 5 0.72
That is, the average of totals for each member. For instance, the member 1001 has a total of 18, in which the category 1 represents 27% of the total. Therefore the average would be 0.27.
Upvotes: 0
Views: 52
Reputation: 886938
Or we can use data.table
library(data.table)
setDT(df1)[, Average := round(Total/sum(Total), 2), Member]
Upvotes: 2
Reputation: 6768
One solution with dplyr
library(dplyr)
df %>% group_by(Member) %>%
mutate(Average = Total/sum(Total)) # to round use mutate(Average = round(Total/sum(Total), 2))
# A tibble: 8 x 4
# Groups: Member [3]
Member Category Total Average
<int> <int> <int> <dbl>
1 1001 1 5 0.2777778
2 1001 2 4 0.2222222
3 1001 3 9 0.5000000
4 1003 1 7 0.5000000
5 1003 2 5 0.3571429
6 1003 3 2 0.1428571
7 1005 1 2 0.2857143
8 1005 3 5 0.7142857
Upvotes: 3
Reputation: 323226
In base R
df['Average']=df$Total/ave(df$Total,df$Member,FUN=sum)
df
Member Category Total Average
1 1001 1 5 0.2777778
2 1001 2 4 0.2222222
3 1001 3 9 0.5000000
4 1003 1 7 0.5000000
5 1003 2 5 0.3571429
6 1003 3 2 0.1428571
7 1005 1 2 0.2857143
8 1005 3 5 0.7142857
Upvotes: 1