首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将年龄组的顺序改为正常顺序

将年龄组的顺序改为正常顺序
EN

Stack Overflow用户
提问于 2021-07-04 07:23:22
回答 3查看 120关注 0票数 1

我有一个名为df的数据框架。在第一步中,我将年龄改为年龄组,然后根据agegroupgender得到每一行的和。

代码语言:javascript
运行
复制
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))

将年龄改为年龄组:

代码语言:javascript
运行
复制
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]

每行之和:

代码语言:javascript
运行
复制
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之后,但我希望订购年龄组。我想要的输出如下:

代码语言:javascript
运行
复制
      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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-04 07:27:32

您将希望将agegroup设置为一个因子并指定因子顺序。实现这一目标的一种方法是使用reorder()。例如

代码语言:javascript
运行
复制
df$agegroup <- reorder(df$agegroup, 
   as.numeric(gsub("-\\d+","", df$agegroup)))

我们使用gsub()来取下第二个数字,然后我们可以用它对第一个数字的数值进行排序。

一旦您更新了级别订单,使其成为您想要的,您应该按照您想要的顺序获得结果。

代码语言:javascript
运行
复制
levels(df$agegroup)
# [1] "0-4"   "5-9"   "10-14" "25-29" "40-44"
票数 2
EN

Stack Overflow用户

发布于 2021-07-04 07:42:33

我在这里重新发明了一些你已经解决了的东西,但是你可以使用cut,给它传递断点和标签。

使用cut的好处是,它将为您提供已经按您希望的顺序排列的因素级别,您只需将它们放在arrange上即可。

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-07-04 19:11:03

我们可以使用来自mixedordergtools

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68242564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档