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