1
votes

Compte par an avec uniquement les données de l'année de début et de fin

Je souhaite créer un graphique linéaire dans ggplot2 avec 350 brasseries. Je veux compter chaque année le nombre de brasseries actives. Je n'ai que la date de début et de fin de l'activité de la brasserie. tidyverse réponses préférées.

begin_datum_jaar est l'année de création de la brasserie. eind_datum_jaar correspond à l'année de fermeture de la brasserie.

exemple de bloc de données:

# A tibble: 13 x 2
   year      n
   <chr> <dbl>
 1 1340      1
 2 1341      1
 3 1342      1
 4 1343      1
 5 etc.      1
 6 1592      2
 7 1593      2
 8 etc.      2
 9 1625      3
10 1626      3
11 1627      3
12 1628      3
13 etc.      3

dput:

df <- structure(list(brouwerijnaam = c("Brand", "Heineken", "Grolsche", 
"Bavaria"), begin_datum_jaar = c(1340L, 1592L, 1615L, 1719L), 
    eind_datum_jaar = c(2019L, 2019L, 2019L, 2010L)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -4L))

Sortie souhaitée où etc. . est un espace réservé.

library(tidyverse)

# A tibble: 4 x 3
  brouwerijnaam begin_datum_jaar eind_datum_jaar
  <chr>                    <int>           <int>
1 Brand                     1340            2019
2 Heineken                  1592            2019
3 Grolsche                  1615            2019
4 Bavaria                   1719            2010


0 commentaires

3 Réponses :


0
votes
  df1 <- data.frame(year=1000:2020) # Enter range for years of choice

  df1 %>% 
  rowwise()%>% 
  mutate(cnt=nrow(df %>% 
                    filter(begin_datum_jaar<year & eind_datum_jaar>year) 
                  )
         )

0 commentaires

3
votes

Pourrait essayer:

# A tibble: 680 x 2
    Year `Active breweries`
   <dbl>              <int>
 1  1340                  1
 2  1341                  1
 3  1342                  1
 4  1343                  1
 5  1344                  1
 6  1345                  1
 7  1346                  1
 8  1347                  1
 9  1348                  1
10  1349                  1
# ... with 670 more rows

Ou essayez expand pour la première partie:

library(data.table)
library(tidyverse)

df <- setDT(df)[
  , .(Year = seq(begin_datum_jaar, eind_datum_jaar, by = 1)), 
  by = brouwerijnaam] %>%
  count(Year, name = "Active breweries")

Cependant, notez que les parties rowwise , do ou expand sont gourmandes en ressources et peuvent prendre du temps. Si cela se produit, je préfère utiliser data.table pour étendre le bloc de données, puis continuer, comme ci-dessous:

library(data.table)
library(tidyverse)

df <- setDT(df)[, .(Year = seq(begin_datum_jaar, eind_datum_jaar, by = 1)), by = brouwerijnaam]

df %>%
  count(Year, name = "Active breweries") %>%
  ggplot(aes(x = Year, y = `Active breweries`)) + 
  geom_line() +
  theme_minimal()

Ce qui précède donne vous l'intrigue directement. Si vous souhaitez d'abord l'enregistrer dans un bloc de données (puis faire la chose ggplot2 ), c'est la partie principale (j'utilise le data.table pour développer car c'est beaucoup plus rapide d'après mon expérience):

df %>%
  group_by(brouwerijnaam) %>%
  expand(Year = begin_datum_jaar:eind_datum_jaar) %>%
  ungroup() %>%
  count(Year, name = "Active breweries") 

Sortie:

library(tidyverse)

df %>%
  rowwise %>%
  do(data.frame(brouwerij = .$brouwerijnaam,
                Year = seq(.$begin_datum_jaar, .$eind_datum_jaar, by = 1))) %>%
  count(Year, name = "Active breweries") %>%
  ggplot(aes(x = Year, y = `Active breweries`)) + 
  geom_line() +
  theme_minimal()


0 commentaires

2
votes

Nous pouvons utiliser map2 pour obtenir la séquence de la date de début à la date de fin pour chaque élément correspondant, unnest la colonne list pour développer et utiliser count pour obtenir la fréquence de l'année

table(unlist(do.call(Map, c(f = `:`, df[-1]))))

Ou en utilisant Map à partir de base R code >

library(tidyverse)
df %>% 
   transmute(year = map2(begin_datum_jaar, eind_datum_jaar, `:`)) %>%
   unnest %>%
   count(year)
# A tibble: 680 x 2
#    year     n
#   <int> <int>
# 1  1340     1
# 2  1341     1
# 3  1342     1
# 4  1343     1
# 5  1344     1
# 6  1345     1
# 7  1346     1
# 8  1347     1
# 9  1348     1
#10  1349     1
# … with 670 more rows


0 commentaires