首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr在列中创建新组

使用dplyr在列中创建新组
EN

Stack Overflow用户
提问于 2021-04-23 02:19:21
回答 2查看 44关注 0票数 1

这是我的数据框架:

代码语言:javascript
复制
mydf<-structure(list(DS_FAIXA_ETARIA = c("Inválido", "16 anos", "17 anos", 
"18 anos", "19 anos", "20 anos", "21 a 24 anos", "25 a 29 anos", 
"30 a 34 anos", "35 a 39 anos"), n = c(5202L, 48253L, 67401L, 
79398L, 88233L, 90738L, 149634L, 198848L, 238406L, 265509L)), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

我想将观察结果分组到一个组中,称为:16 a 20 anos

代码语言:javascript
复制
"16 anos", "17 anos", 
"18 anos", "19 anos", "20 anos"

换句话说,我想“合并”第2-6行,并对n列的观察结果求和。我会让一行表示第2-6行的总和。

是否可以先使用group_by,然后使用dplyr中的summarise(sum(DS_FAIXA_ETARIA))动词来完成此操作?

这将是我想要的输出:

代码语言:javascript
复制
mydf<-structure(list(DS_FAIXA_ETARIA = c("Inválido","16 a 20 anos" ,"21 a 24 anos", "25 a 29 anos", 
                                   "30 a 34 anos", "35 a 39 anos"), n = c(5202L,374023L , 149634L, 198848L, 238406L, 265509L)), row.names = c(NA, 
                                                                                                                                                      -6L), class = c("tbl_df", "tbl", "data.frame"))

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-23 02:32:32

这应该是工作。第一次使用summarize求和。然后通过add_row连接到原始数据帧。slice_tailarrange

代码语言:javascript
复制
df1 <- mydf %>% 
  summarise(`16 a 20 anos`= sum(n[2:6]))

mydf %>% 
  add_row(DS_FAIXA_ETARIA=names(df1), n=df1$`16 a 20 anos`[1]) %>% 
  slice_tail(n=5) %>% 
  arrange(DS_FAIXA_ETARIA)

输出:

代码语言:javascript
复制
  DS_FAIXA_ETARIA      n
  <chr>            <int>
1 16 a 20 anos    374023
2 21 a 24 anos    149634
3 25 a 29 anos    198848
4 30 a 34 anos    238406
5 35 a 39 anos    265509
票数 2
EN

Stack Overflow用户

发布于 2021-04-23 02:28:43

我们根据'Invalido‘或那些只有数字(\\d+)后跟空格和’ano‘的元素的出现情况创建一个分组变量,然后通过对first和last元素执行paste来创建summarise,同时获得'n’的sum

代码语言:javascript
复制
library(dplyr)
library(stringr)
mydf %>% 
  group_by(grp = replace(cumsum(!str_detect(DS_FAIXA_ETARIA,
     '^\\d+\\s+anos$')), DS_FAIXA_ETARIA == 'Inválido', 0))  %>% 
  summarise(DS_FAIXA_ETARIA = if(n() > 1) 
      str_c(DS_FAIXA_ETARIA[c(1, n())], collapse="_") else 
    DS_FAIXA_ETARIA, n = sum(n), .groups = 'drop') %>%
  select(-grp)

-output

代码语言:javascript
复制
# A tibble: 6 x 2
#  DS_FAIXA_ETARIA      n
#  <chr>            <int>
#1 Inválido          5202
#2 16 anos_20 anos 374023
#3 21 a 24 anos    149634
#4 25 a 29 anos    198848
#5 30 a 34 anos    238406
#6 35 a 39 anos    265509
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67218807

复制
相关文章

相似问题

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