首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >展开矩阵,以包括间隔中每个元素的行。

展开矩阵,以包括间隔中每个元素的行。
EN

Stack Overflow用户
提问于 2022-08-31 18:06:39
回答 2查看 35关注 0票数 4

我有一个数据框架,其中包含了关于世界各国事故的信息。数据框架的结构类似于以下示例:

代码语言:javascript
复制
a <- data.frame(country = c("AAA" , "BBB" , "CCC") ,
                incident = rep("disaster" , times = 3) ,
                'start year' = c(1990 , 1995 , 2011) ,
                'end year' = c(1993 , 1995 , 2012))

给予a

代码语言:javascript
复制
  country incident start.year end.year
1     AAA disaster       1990     1993
2     BBB disaster       1995     1995
3     CCC disaster       2011     2012

我想对此进行转换,以便每一行都包含每一年的事件,而不是仅包含间隔。理想情况下,它看起来应该是这样的:

代码语言:javascript
复制
  country incident year
1     AAA disaster 1990
2     AAA disaster 1991
3     AAA disaster 1992
4     AAA disaster 1993
5     BBB disaster 1995
6     CCC disaster 2011
7     CCC disaster 2012

是否有一个最优的代码可以将其转换为包含起始年和结束年?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-31 18:12:35

我们可以使用map2作为list获取两列之间的序列,然后将list列作为unnest

代码语言:javascript
复制
library(dplyr)
library(purrr)
library(tidyr)
a %>%
   transmute(country, incident, year = map2(start.year, end.year, `:`)) %>%
   unnest(year)

-output

代码语言:javascript
复制
# A tibble: 7 × 3
  country incident  year
  <chr>   <chr>    <int>
1 AAA     disaster  1990
2 AAA     disaster  1991
3 AAA     disaster  1992
4 AAA     disaster  1993
5 BBB     disaster  1995
6 CCC     disaster  2011
7 CCC     disaster  2012

如果“country”列为unique,则可以使用组by/汇总,也可以使用rowwise展开

代码语言:javascript
复制
a %>% 
   group_by(country) %>%
   summarise(incident, year = start.year:end.year, .groups = 'drop')
# A tibble: 7 × 3
  country incident  year
  <chr>   <chr>    <int>
1 AAA     disaster  1990
2 AAA     disaster  1991
3 AAA     disaster  1992
4 AAA     disaster  1993
5 BBB     disaster  1995
6 CCC     disaster  2011
7 CCC     disaster  2012

或者使用uncount扩展数据

代码语言:javascript
复制
a %>% 
 uncount(end.year - start.year + 1) %>% 
 group_by(country) %>%
  mutate(year = start.year + row_number() - 1, .keep = 'unused', 
     end.year = NULL) %>% 
  ungroup
票数 4
EN

Stack Overflow用户

发布于 2022-08-31 18:36:54

以下是使用pivot_longerfillcomplete的另一种选择

代码语言:javascript
复制
library(dplyr)
library(tidyr)

a %>% 
  pivot_longer(cols = ends_with("year"),
               values_to = "year") %>% 
  group_by(country) %>% 
  complete(year = full_seq(min(year):max(year), 1)) %>% 
  fill(c(incident)) %>% 
  select(-name)
代码语言:javascript
复制
  country  year incident
  <chr>   <dbl> <chr>   
1 AAA      1990 disaster
2 AAA      1991 disaster
3 AAA      1992 disaster
4 AAA      1993 disaster
5 BBB      1995 disaster
6 BBB      1995 disaster
7 CCC      2011 disaster
8 CCC      2012 disaster
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73560132

复制
相关文章

相似问题

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