如何使用dplyr将具有不同值的两个不同行汇总为具有该总和的一行?
我有以下数据框,但规模当然更大: 国家 年 拉紧 个案数目 墨西哥 1996 sp_m014 412 墨西哥 1996 sp_f014 214 墨西哥 1998 sp_m014 150 墨西哥 1998 sp_f014 200 美国 1996 sp_m014 200 美国 1996 sp_f014 180 美国 1997 sp_m014 190 美国 1997 sp_f014 150如何使用dplyr将具有不同值的两个不同行汇总为具有该总和的一行?,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我有以下数据框,但规模当然更大: 国家 年 拉紧 个案数目 墨西哥 1996 sp_m014 412 墨西哥 1996 sp_f014 214 墨西哥 1998 sp_m014 150 墨西哥 1998 sp_f014 200 美国 1996 sp_m014 200 美国 1996 sp_f014 180 美国 1997 sp_m014 190 美国 1997 sp_f014 150 按“国家”、“年份”分组,汇总,将“菌株”更新为“sp”,并获得“数量病例”的总和 library(dplyr)
按“国家”、“年份”分组,汇总,将“菌株”更新为“sp”,并获得“数量病例”的总和
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
#一个tible:4 x 4
#国家年度病例数
#*
#1兆欧1996标准普尔626
#2兆欧1998标准普尔350
#3美国1996 sp 380
#4美国1997 sp 340
数据
df1按“国家”、“年份”分组总结
将“菌株”更新为“sp”,并获得“数量病例”的总和
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
#一个tible:4 x 4
#国家年度病例数
#*
#1兆欧1996标准普尔626
#2兆欧1998标准普尔350
#3美国1996 sp 380
#4美国1997 sp 340
数据
df1下面是一种使用tidyr::extract的方法:
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
library(tidyr);图书馆(dplyr)
df1%>%
提取(菌株,进入=c(“菌株”,“性别”,“年龄”),“(\\w+)([mf])(.*))”)%>%
组别(国家、年份、菌株)%>%
总结(跨越(数量、总数))
#一个tibble:4x4
#分组:国家,年份[4]
国家年度病例数
1兆欧1996标准普尔626
2兆欧1998标准普尔350
3美国1996 sp 380
4美国1997 sp 340
现在你已经完全解析了菌株,你可以很容易地按性别或年龄进行分组。感谢@akrun提供的数据。这里有一个使用tidyr::extract的方法:
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
library(tidyr);图书馆(dplyr)
df1%>%
提取(菌株,进入=c(“菌株”,“性别”,“年龄”),“(\\w+)([mf])(.*))”)%>%
组别(国家、年份、菌株)%>%
总结(跨越(数量、总数))
#一个tibble:4x4
#分组:国家,年份[4]
国家年度病例数
1兆欧1996标准普尔626
2兆欧1998标准普尔350
3美国1996 sp 380
4美国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
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
输出:
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
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
country-year-strain-num\u病例数
1兆欧1996标准普尔626
2兆欧1998标准普尔350
3美国1996 sp 380
4美国1997 sp 340
更新:
要使用年龄范围,您可以执行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
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
输出:
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
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
country-year-strain-num\u病例数
1兆欧1996标准普尔626
2兆欧1998标准普尔350
3美国1996 sp 380
4美国1997 sp 340
我想您不希望正则表达式中出现问号。否则,age
列为空。我想您不希望正则表达式中出现问号。否则,age
列为空!这解决了我的问题。顺便说一下,我在“summary”文档中找不到.group(“drop”)参数。你能告诉我哪里可以看到它是如何工作的吗?@Jvet它在摘要中提到过。您是否正在使用当前版本的dplyr
。还有,你能查一下吗?谢谢!这解决了我的问题。顺便说一下,我在“summary”文档中找不到.group(“drop”)参数。你能告诉我哪里可以看到它是如何工作的吗?@Jvet它在摘要中提到过。您是否正在使用当前版本的dplyr
。还有,你能查一下吗?嗨,谢谢!如果不是sp呢?我想对年龄范围进行分类。正如我提到的,根据性别和年龄,我的数据中有sp_014。我们生成了一个名为“age_range”的列,而不是列“strain”,然后我们看到的是相同的num_情况,只是age_范围。014只是一个例子,我在我的真实数据01415242534,直到65岁。请看我的编辑。我在第一次回答时没有意识到这一点。嗨,谢谢!如果不是sp呢?我想对年龄范围进行分类。正如我提到的,根据性别和年龄,我的数据中有sp_014。我们生成了一个名为“age_range”的列,而不是列“strain”,然后我们看到的是相同的num_情况,只是age_范围。014只是一个例子,我在我的真实数据01415242534,直到65岁。请看我的编辑。我在第一次回答时没有意识到这一点。是的,对不起。这就是为什么我把它还原成原来的我想。真的很抱歉,我的错误!我感到困惑,开始改变事情,我想我已经恢复到原来的样子了。是的,对不起。这就是为什么我把它还原成原来的我想。真的很抱歉,我的错误!我感到困惑,开始改变事情,我想我已经回到了原来的样子。