Мы можем использовать ave()
для расчета групповых сумм и использовать их для расчета процентов.
sums <- ave(tt[-(1:3)], tt[,1], FUN=function(x) lapply(x, sum))
tt[-(1:3)] <- round(100*tt[-(1:3)]/sums, 3)
tt
# area sex agegrouping X2011 X2012 X2013
# 1 area1 F 0-4 14.367 14.485 14.262
# 2 area1 F 10-14 9.416 9.304 9.828
# 3 area1 F 15-19 8.127 8.359 8.714
# 4 area1 F 20-24 12.677 13.840 14.771
# 5 area1 M 0-4 13.096 13.433 13.299
# 6 area1 M 10-14 9.197 8.782 9.027
# 7 area1 M 15-19 8.580 9.069 9.200
# 8 area1 M 20-24 24.542 22.728 20.899
# 9 area2 F 0-4 12.079 12.814 13.415
# 10 area2 F 10-14 9.376 10.122 11.265
# 11 area2 F 15-19 9.277 8.664 8.572
# 12 area2 F 20-24 17.708 16.745 15.602
# 13 area2 M 0-4 14.961 15.477 15.714
# 14 area2 M 10-14 9.628 9.751 10.168
# 15 area2 M 15-19 10.033 9.748 9.422
# 16 area2 M 20-24 16.937 16.679 15.843
Данные:
tt <- structure(list(area=structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label=c("area1",
"area2"), class="factor"), sex=structure(c(1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label=c("F",
"M"), class="factor"), agegrouping=structure(c(1L, 2L, 3L, 4L,
1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L),
.Label=c("0-4", "10-14", "15-19", "20-24"), class="factor"),
X2011=c(637.5, 417.8, 360.6, 562.5, 581.1, 408.1, 380.7, 1089,
460.3, 357.3, 353.5, 674.8, 570.1, 366.9, 382.3, 645.4),
X2012=c(626.6, 402.5, 361.6, 598.7, 581.1, 379.9, 392.3, 983.2,
479.8, 379, 324.4, 627, 579.5, 365.1, 365, 624.5),
X2013=c(596.7, 411.2, 364.6, 618, 556.4, 377.7, 384.9, 874.4,
489.1, 410.7, 312.5, 568.8, 572.9, 370.7, 343.5, 577.6)),
row.names=c(NA, -16L), class="data.frame")