我有一个名为df
的数据框架。在第一步中,我将年龄改为年龄组,然后根据agegroup
和gender
得到每一行的和。
df<- data_frame(age= c(0,1,3,5,6,29,43,12,1,3,5,12,29,43,0,6), pop= c(12,11,33,45,56,54,67,76,65,11,78,90,112,29,70,60),gender=c(2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1))
将年龄改为年龄组:
x <- df$age %/% 5
x <- pmax(0, pmin(20, x))
df$agegroup<- c(paste(0:19*5, 1:20*5-1, sep="-"), "+100")[x+1]
每行之和:
df1 <- aggregate(formula = pop ~ gender + agegroup, data = df, FUN = sum)
gender agegroup pop
1 1 0-4 146
2 2 0-4 56
3 1 10-14 90
4 2 10-14 76
5 1 25-29 112
6 2 25-29 54
7 1 40-44 29
8 2 40-44 67
9 1 5-9 138
10 2 5-9 101
如df1中所示,年龄组5-9
位于40-44
之后,但我希望订购年龄组。我想要的输出如下:
gender agegroup pop
1 1 0-4 146
2 2 0-4 56
3 1 5-9 138
4 2 5-9 101
5 1 10-14 90
6 2 10-14 76
7 1 25-29 112
8 2 25-29 54
9 1 40-44 29
10 2 40-44 67
发布于 2021-07-04 07:27:32
您将希望将agegroup
设置为一个因子并指定因子顺序。实现这一目标的一种方法是使用reorder()
。例如
df$agegroup <- reorder(df$agegroup,
as.numeric(gsub("-\\d+","", df$agegroup)))
我们使用gsub()
来取下第二个数字,然后我们可以用它对第一个数字的数值进行排序。
一旦您更新了级别订单,使其成为您想要的,您应该按照您想要的顺序获得结果。
levels(df$agegroup)
# [1] "0-4" "5-9" "10-14" "25-29" "40-44"
发布于 2021-07-04 07:42:33
我在这里重新发明了一些你已经解决了的东西,但是你可以使用cut
,给它传递断点和标签。
使用cut
的好处是,它将为您提供已经按您希望的顺序排列的因素级别,您只需将它们放在arrange
上即可。
library(dplyr)
x1 <- c(0, seq(4, 100, 5))
labels <- c(paste(x1[-length(x1)] + 1, x1[-1], sep = '-'), '100+')
labels[1] <- '0-4'
df %>%
group_by(gender, agegroup = cut(age, c(x1, Inf), labels, include.lowest = TRUE)) %>%
summarise(pop = sum(pop)) %>%
ungroup %>%
arrange(agegroup)
# gender agegroup pop
# <dbl> <fct> <dbl>
# 1 1 0-4 146
# 2 2 0-4 56
# 3 1 5-9 138
# 4 2 5-9 101
# 5 1 10-14 90
# 6 2 10-14 76
# 7 1 25-29 112
# 8 2 25-29 54
# 9 1 40-44 29
#10 2 40-44 67
发布于 2021-07-04 19:11:03
我们可以使用来自mixedorder
的gtools
df1[gtools::mixedorder(df1$agegroup),]
gender agegroup pop
1 1 0-4 146
2 2 0-4 56
9 1 5-9 138
10 2 5-9 101
3 1 10-14 90
4 2 10-14 76
5 1 25-29 112
6 2 25-29 54
7 1 40-44 29
8 2 40-44 67
https://stackoverflow.com/questions/68242564
复制相似问题