R语言 根据具体情况按组汇总连续年度

fcwjkofz  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(162)

我有一个包含国家、年份和增长率三列的数据集,我想找出一个国家在3年或更长时间内增长率〉=6%的时期,旁边还有一列是该时期的平均增长率。
我需要创建一个数据框,如下所示:阿尔巴尼亚1999-2001年,0.133(即国家、时期和平均增长列)等。
我过滤了原始数据框,显示了增长率〉= 0.06的年份,这里有一个国家:

country cow_code years growth
 1 Albania      339 1999  0.158 
 2 Albania      339 2000  0.106 
 3 Albania      339 2001  0.136 
 4 Albania      339 2003  0.123 
 5 Albania      339 2004  0.0930
 6 Albania      339 2006  0.228 
 7 Albania      339 2007  0.238 
 8 Albania      339 2008  0.178 
 9 Albania      339 2010  0.0744
10 Albania      339 2018  0.0825
11 Albania      339 2019  0.137 
12 Albania      339 2021  0.181

我想为我原始数据框中的所有国家生成这样的东西:

country    period mean_growth
 1 Albania 1999-2001       0.133
 2 Albania 2006-2008       0.215

你知道我该怎么做吗?

h6my8fg2

h6my8fg21#

您可以使用cumsum(c(1, diff(years) != 1))将数据按国家/地区拆分为连续年份组。

library(dplyr)

df %>%
  mutate(grp = cumsum(c(1, diff(years) != 1)), .by = country) %>%
  group_by(country, grp) %>%
  filter(n() >= 3) %>%
  summarise(period = paste(range(years), collapse = '-'),
            mean_growth = mean(growth), .groups = "drop") %>%
  select(-grp)

# # A tibble: 2 × 3
#   country period    mean_growth
#   <chr>   <chr>           <dbl>
# 1 Albania 1999-2001       0.133
# 2 Albania 2006-2008       0.215
数据
df <- read.table(text = "
  country cow_code years growth
 1 Albania      339 1999  0.158 
 2 Albania      339 2000  0.106 
 3 Albania      339 2001  0.136 
 4 Albania      339 2003  0.123 
 5 Albania      339 2004  0.0930
 6 Albania      339 2006  0.228 
 7 Albania      339 2007  0.238 
 8 Albania      339 2008  0.178 
 9 Albania      339 2010  0.0744
10 Albania      339 2018  0.0825
11 Albania      339 2019  0.137 
12 Albania      339 2021  0.181")
igetnqfo

igetnqfo2#

下面是一个data.table方法:

library(data.table)

setDT(df1)[growth >= 0.06,][order(country, years), 
                            consec := cumsum(c(TRUE, diff(as.numeric(years)) > 1)), 
                            .(country)][, if (.N > 2) .SD, 
                                        .(country, consec)][,.(period = paste(first(years), 
                                                                              last(years), 
                                                                              sep = "-"),
                                                               avg_growth = mean(growth)), 
                                                            .(country, consec)][, !"consec"]
#>    country    period avg_growth
#> 1: Albania 1999-2001  0.1333333
#> 2: Albania 2006-2008  0.2146667

最好先按years排列,再确定连续年份,下面是添加了该步骤的dplyr解决方案。

library(dplyr)

df1 %>% 
  filter(growth >= 0.06) %>% 
  arrange(country, years) %>% 
  mutate(consec = cumsum(c(TRUE, diff(as.numeric(years)) > 1)), 
         .by = country) %>% 
  group_by(country, consec) %>% 
  filter(n() >= 3) %>% 
  summarise(years = paste(years[1],years[n()], sep = "-"), 
            avg_growth = mean(growth), 
            .groups = "drop") %>% 
  select(-consec)
#> # A tibble: 2 x 3
#>   country years     avg_growth
#>   <chr>   <chr>          <dbl>
#> 1 Albania 1999-2001      0.133
#> 2 Albania 2006-2008      0.215

数据:

read.table(text = "  country cow_code years growth
 1 Albania      339 1999  0.158 
 2 Albania      339 2000  0.106 
 3 Albania      339 2001  0.136 
 4 Albania      339 2003  0.123 
 5 Albania      339 2004  0.0930
 6 Albania      339 2006  0.228 
 7 Albania      339 2007  0.238 
 8 Albania      339 2008  0.178 
 9 Albania      339 2010  0.0744
10 Albania      339 2018  0.0825
11 Albania      339 2019  0.137 
12 Albania      339 2021  0.181" , header = T, stringsAsFactors = F) -> df1

相关问题