我有两个表,例如:
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%
我确信有一种简单的方法可以做到这一点,但我还没有找到它。 谢谢你的帮助!
答案 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