R - 用两个表计算百分比

时间:2018-06-06 14:04:50

标签: r dataframe

我有两个表,例如:

       Country Gender freq
1     Alemania  Mujer  899
2     Alemania Hombre 5266
3       España  Mujer 1569
4       España Hombre 5582
5      Francia  Mujer 1398
6      Francia Hombre 5054
7       Italia  Mujer 1448
8       Italia Hombre 3377
9     Portugal  Mujer  246
10    Portugal Hombre  956
11 Reino Unido  Mujer 1399
12 Reino Unido Hombre 6594

      Country freq
1    Alemania 6165
2      España 7151
3     Francia 6452
4      Italia 4825
5    Portugal 1202
6 Reino Unido 7993

我想得到每个国家的男性(Hombre)和女性(Mujer)的百分比。结果看起来像这样(数字不正确):

       Country Gender percentage
1     Alemania  Mujer  15%
2     Alemania Hombre  85%
3       España  Mujer  20%
4       España Hombre  80%
5      Francia  Mujer  18%
6      Francia Hombre  82%
7       Italia  Mujer  25%
8       Italia Hombre  75%
9     Portugal  Mujer  25%
10    Portugal Hombre  75%
11 Reino Unido  Mujer  12%
12 Reino Unido Hombre  88%

我确信有一种简单的方法可以做到这一点,但我还没有找到它。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

我们可以执行left_join并划分列

library(dplyr)
left_join(df1, df2, by = 'Country')%>%
  transmute(Gender, Country, percentage = paste0(round(100 *freq.x/freq.y), "%"))
#     Gender     Country percentage
#1   Mujer    Alemania        15%
#2  Hombre    Alemania        85%
#3   Mujer      España        22%
#4  Hombre      España        78%
#5   Mujer     Francia        22%
#6  Hombre     Francia        78%
#7   Mujer      Italia        30%
#8  Hombre      Italia        70%
#9   Mujer    Portugal        20%
#10 Hombre    Portugal        80%
#11  Mujer Reino Unido        18%
#12 Hombre Reino Unido        82%

或在match

中使用base R
df1$percentage <- paste0(round(100 * df1$freq/df2$freq[match(df1$Country,
                  df2$Country)]), "%")

答案 1 :(得分:2)

您不需要第二张表

library(dplyr)

df <- data.frame(Country = rep(c("Alemania", "España", "Francia"), each = 2), Gender = rep(c("Mujer", "Hombre"), 3), freq = c(899, 5266, 1569, 5582, 1398, 5054))

df %>% group_by(Country) %>% mutate(total = sum(freq)) %>% mutate(percentage = 100*freq/total) %>% select(Country, Gender, percentage)

看起来像:

1 Alemania Mujer       14.6
2 Alemania Hombre      85.4
3 España   Mujer       21.9
4 España   Hombre      78.1
5 Francia  Mujer       21.7
6 Francia  Hombre      78.3