Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用dplyr将具有不同值的两个不同行汇总为具有该总和的一行?_R_Dplyr_Tidyverse - Fatal编程技术网

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

如何使用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)

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

国家 年 拉紧 个案数目 墨西哥 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)
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岁。请看我的编辑。我在第一次回答时没有意识到这一点。是的,对不起。这就是为什么我把它还原成原来的我想。真的很抱歉,我的错误!我感到困惑,开始改变事情,我想我已经恢复到原来的样子了。是的,对不起。这就是为什么我把它还原成原来的我想。真的很抱歉,我的错误!我感到困惑,开始改变事情,我想我已经回到了原来的样子。