提问者:小点点

如何使用dplyr将具有不同值的两个不同行汇总到具有该总和的单行?


我有以下数据框架,但当然规模更大:

我想得到以下结果,即墨西哥和美国各自的sp_m014(男性)和sp_f014(女性)之和:

在我的真实数据框架中,我有更多的年龄范围,这里我只显示了男性和女性的014。但是我想对每个年龄范围和性别进行总结。

谢谢!


共3个答案

匿名用户

按国家分组,年份汇总以将应变更新为sp,并获取num_cases的sum

library(dplyr)
df1 %>%
   group_by(country, year) %>%
   summarise(strain = 'sp', num_cases = sum(num_cases), .groups = 'drop')

-输出

# A tibble: 4 x 4
#  country  year strain num_cases
#* <chr>   <int> <chr>      <int>
#1 mex      1996 sp           626
#2 mex      1998 sp           350
#3 usa      1996 sp           380
#4 usa      1997 sp           340
df1 <- structure(list(country = c("mex", "mex", "mex", "mex", "usa", 
"usa", "usa", "usa"), year = c(1996L, 1996L, 1998L, 1998L, 1996L, 
1996L, 1997L, 1997L), strain = c("sp_m014", "sp_f014", "sp_m014", 
"sp_f014", "sp_m014", "sp_f014", "sp_m014", "sp_f014"), num_cases = c(412L, 
214L, 150L, 200L, 200L, 180L, 190L, 150L)), 
class = "data.frame", row.names = c(NA, 
-8L))

匿名用户

这是一个使用tidyr::exacy的方法:

library(tidyr);library(dplyr)
df1 %>%
  extract(strain, into = c("strain","sex","age"), "(\\w+)_([mf])(.*)") %>%
  group_by(country,year,strain) %>% 
  summarise(across(num_cases,sum))
# A tibble: 4 x 4
# Groups:   country, year [4]
  country  year strain num_cases
  <chr>   <int> <chr>      <int>
1 mex      1996 sp           626
2 mex      1998 sp           350
3 usa      1996 sp           380
4 usa      1997 sp           340

现在你已经完全解析了菌株,你可以很容易地按性别或年龄分组。感谢@akrun提供的数据。

匿名用户

更新:要使用年龄范围,您可以执行parse_number

df1 %>% 
  mutate(age_range=parse_number(strain)) %>% 
  group_by(country, year, age_range) %>% 
  summarise(num_cases=sum(num_cases))

输出:

  country  year age_range num_cases
  <chr>   <int>     <dbl>     <int>
1 mex      1996        14       626
2 mex      1998        14       350
3 usa      1996        14       380
4 usa      1997        14       340

第一个答案:感谢akrun提供的数据:

library(tidyverse)
df1 %>% 
  group_by(country, year, strain) %>% 
  mutate(strain=str_extract(strain, "^.{2}")) %>% 
  summarise(num_cases=sum(num_cases))

输出:

  country  year strain num_cases
  <chr>   <int> <chr>      <int>
1 mex      1996 sp           626
2 mex      1998 sp           350
3 usa      1996 sp           380
4 usa      1997 sp           340