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
3 Réponses :
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) ) )
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()
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