-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboulders.Rmd
executable file
·254 lines (196 loc) · 16.1 KB
/
boulders.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
---
title: The World's Hardest Boulder Problems Sent by Men (V15 and up)
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tidyr)
library(lubridate)
library(ggplot2)
library(knitr)
require(dplyr)
library(DT)
#library(kableExtra)
download.file('https://docs.google.com/spreadsheets/d/1smPVNfWnorZTUCITZOsKcWu2WkVdzBX-_U0qbeeUvB4/export?gid=660274014&format=csv', 'HardBoulders2.csv')
```
**Table of Contents:**<br>
[The World's Hardest Boulder Problems Sent by Men](#hardestproblems)<br>
[The World’s Current Hardest Boulder Problem](#hardest)<br>
[Who Is the Strongest Male Boulderer Ever?](#strongest)<br>
[Trends Over Time](#trends)<br>
[How Many Men Can Climb V15 or Higher?](#howmany)<br>
[Which Countries Have the Hardest Boulder Problems?](#whichcountries)<br>
[What About Age?](#age)<br>
[Height?](#height)
***Last updated:** January 2022. If you notice anything that is an error, or you would like to help improve the list, please let me know.*
*[Note: this site and list are still under construction. Things I still need to do: <br>
- Fix table of contents <br>
- Add ability for users to comment]*
The following is an attempt to update [Alex Beale](https://www.99boulders.com/author/alex)'s fantastic list of [The World's Hardest Boulder Problems](https://www.99boulders.com/hardest-boulder-problems), which attempted to collect the hardest boulder problems with a lower cutoff grade of V15 (8C).
As of January 2022, Mr. Beale has not updated the site past March of 2019. This is really unfortunate as hard bouldering has really jumped starting in 2019 (which show). The following is my attempt to create the most up-to-date list of hard boulder sends.
```{r, include=FALSE}
mydata <- read.csv("HardBoulders2.csv")
mydata$Date <- format(as.Date(mdy(mydata$Date), "%m/%d/%Y"))
mydata$Date <- format(mydata$Date, format = "%Y/%m/%d")
#mydata$Date <- as.Date(mydata$Date)
```
As it stands, there are currently `r nrow(mydata)` entries; of which `r sum(complete.cases(mydata$Date))` have dates.
```{r, echo=FALSE}
uniquebygrade <- mydata %>% count(Grade, Name, sort=TRUE) %>% count(Grade, sort=TRUE)
```
As of this writing, there now appear to be `r uniquebygrade[uniquebygrade$Grade==15.0,]$n` climbs rated **V15 (8C)**, `r uniquebygrade[uniquebygrade$Grade==16.0,]$n` climbs rated **V16 (8C+)**, and `r uniquebygrade[uniquebygrade$Grade==17.0,]$n` climbs rated **V17 (9A)**.
Compared to Alex Beale's list, that is `r uniquebygrade[uniquebygrade$Grade==16.0,]$n - 12` more V16s than there were in March 2019!
```{r, echo=FALSE}
problemcounts15 <- mydata %>% dplyr::filter(Grade == 15.0)
problemcounts15 <- as.data.frame(table(problemcounts15$Route))
problemcounts15 <- problemcounts15 %>% top_n(3,Freq) %>% arrange(desc(Freq))
```
The most climbed **V15** boulder is **`r problemcounts15$Var1[1]`** with `r problemcounts15$Freq[1]` ascents; followed by **`r problemcounts15$Var1[2]`** and **`r problemcounts15$Var1[3]`** with `r problemcounts15$Freq[2]` and `r problemcounts15$Freq[3]` ascents, respectively.
```{r, echo=FALSE}
problemcounts16 <- mydata %>% dplyr::filter(Grade == 16.0)
problemcounts16 <- as.data.frame(table(problemcounts16$Route))
problemcounts16 <- problemcounts16 %>% top_n(3,Freq) %>% arrange(desc(Freq))
```
The most climbed **V16** boulder is **`r problemcounts16$Var1[1]`** with `r problemcounts16$Freq[1]` ascents; followed by **`r problemcounts16$Var1[2]`** and **`r problemcounts16$Var1[3]`** with `r problemcounts16$Freq[2]` and `r problemcounts16$Freq[3]` ascents, respectively.
[Here is a link](https://bit.ly/3FYSddM) to the Google Spreadsheet
# The World's Hardest Boulder Problems Sent by Men {#hardestproblems}
```{r, echo=FALSE}
mydata2 <- mydata %>% group_by(Route) %>% mutate(count = n()) %>% mutate(repeated = case_when (count == 1 ~ "Unrepeated", count > 1 ~ "Repeated"))
DT::datatable(mydata2[,c(1:8,14)], colnames = c('Route Name', 'Climber', 'Consensus VGrade', 'FA', 'Country', 'Area', 'Date', 'Suggested VGrade by Climber', 'Repeated?'), options = list(order = list(list(0, 'asc'), list(1,'asc')), columnDefs = list(list(className = 'dt-center', targets = 0:8)), pageLength = 900, autoWidth = TRUE), rownames = FALSE)
```
# The World’s Hardest Boulder Problem {#hardest}
Based solely on grade, the title of world’s hardest boulder problem is currently shared by two problems: [Burden of Dreams](https://climbing-history.org/climb/826/burden-of-dreams) and [Return of the Sleepwalker](https://climbing-history.org/climb/1116/return-of-the-sleepwalker). Both are currently graded V17 (9A).
Both problems have only one ascent. Nalle Hukkataival sent Burden of Dreams in October 2016, making it the first problem ever to receive a proposed grade of V17 (9A). Daniel Woods sent Return of the Sleepwalker in March 2021.
Two other problems have been graded V17, to then be downgraded. [The Big Island (sit)](https://climbing-history.org/climb/849/soudain-seul), first climbed by Simon Lorenzi in February 2021 as V17, has since been downgraded by Nico Pelorson in April 2021 (I have given this climb a grade of 16.5). [No Kpote Only](https://climbing-history.org/climb/827/no-kpote-only), first climbed by Charles Albert (barefoot!) in 2019 as V17, has seen two repeats, with the most recent suggesting a downgrade of V15 (Nico Pelorson again; I have recorded the grade as V15 here).
# Who Is the Strongest Male Boulderer Ever? {#strongest}
The following are two bar plots based on the data in the above list showing who has sent the most hard boulder problems and who has put up the most hard boulder first ascents (FAs).
```{r, echo=FALSE}
climbercounts <- table(mydata$Name)
climbercounts <- climbercounts[climbercounts > 12]
ggplot(as.data.frame(climbercounts), aes(x=reorder(Var1, -Freq), y = Freq)) + geom_bar(stat="identity", fill="blue", width=0.5) + geom_text(aes(label=Freq), position=position_dodge(width=0.9), vjust=-0.25, size=3) +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) + ggtitle("Number of Hard Sends by Climber") +
labs(y="Number", x = "Climber")
#ggsave("images/NumberbyClimber.png", width = 20, height = 20, units = "cm")
```
```{r, echo=FALSE}
climberFA <- mydata %>% dplyr::filter(FA == "FA")
climberFAcounts <- table(climberFA$Name)
climberFAcounts <- climberFAcounts[climberFAcounts > 7]
ggplot(as.data.frame(climberFAcounts), aes(x=reorder(Var1, -Freq), y = Freq)) + geom_bar(stat="identity", fill="blue", width=0.5) + geom_text(aes(label=Freq), position=position_dodge(width=0.9), vjust=-0.25, size=3) +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) + ggtitle("Number of Hard FA Sends by Climber") +
labs(y="Number", x = "Climber")
#ggsave("images/NumberFAbyClimber.png", width = 20, height = 20, units = "cm")
```
```{r, echo=FALSE}
strongest <- as.data.frame(table(mydata$Name))
strongest <- strongest %>% top_n(3,Freq) %>% arrange(desc(Freq))
strongestFA <- as.data.frame(table(climberFA$Name))
strongestFA <- strongestFA %>% top_n(3,Freq) %>% arrange(desc(Freq))
```
The strongest climber by most hard boulder sends is `r strongest$Var1[1]` with `r strongest$Freq[1]` ascents; `r strongest$Freq[1] - strongest$Freq[2]` more than the `r strongest$Var1[2]` with the second most ascents. However, `r strongestFA$Var1[1]` has the most FAs with `r strongestFA$Freq[1]`; `r strongestFA$Freq[1] - strongestFA$Freq[2]` more than `r strongestFA$Var1[2]`, and an impressive amount of hard sends to his name. Finally, both Daniel Woods and Nalle Hukkataival are the only climbers to have sent a V17.
# Trends Over Time {#trends}
```{r, echo=FALSE}
#format(as.Date(mydata$Date, format="%m/%d/%Y"),"%Y")
yearcounts <- table(format(as.Date(mydata$Date),"%Y"))
ggplot(as.data.frame(yearcounts), aes(x=Var1, y = Freq)) + geom_bar(stat="identity", fill="blue", width=0.5) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + ggtitle("Hard Boulder Sends by Year") +
labs(y="Number", x = "Year")
#ggsave("images/Year.png", width = 20, height = 20, units = "cm")
```
Starting in `r min(na.omit(format(as.Date(mydata$Date, format="%m/%d/%Y"),"%Y")))` with some of the first consensus V15s ([Black Eagle SD](https://climbing-history.org/climb/1143/black-eagle-assis) and [Monkey Wedding](https://climbing-history.org/climb/107/monkey-wedding), both FAs by Fred Nicole; [Dreamtime](https://climbing-history.org/climb/138/dreamtime-(pre-break)) by Fred Nicole was the first V15 in 2000, but was subsequently downgraded to V14...until around 2010 when a hold broke taking it back to V15), there was a flat year-to-year addition of hard boulders (with the exception of a jump in 2004), only to start growing around 2010. 2013 appears to be an outlier for some reason (perhaps I have mixed up 2012 and 2013 dates). Finally, starting in 2019, we have a big bump in hard boulder sends...
It took two years from the first suggested V15 (Dreamtime (pre-break)) to a consensus V15 (Black Eagle SD / Monkey Wedding). For V16, the first suggested problem appears to have been Tonino ’78, first sent by Mauro Calibani in 2004. But it wouldn't be until 2016 (12 years later) when Daniel Woods put up [Creature from the Black Lagoon](https://climbing-history.org/climb/1091/creature-from-the-black-lagoon), the world's first consensus V16.
Nalle Hukkataival's [Burden of Dreams](https://climbing-history.org/climb/826/burden-of-dreams), first sent in 2016, has yet to see a repeat to confirm the grade (6 years and counting). Although, I have a sneaky suspicion we will see the first confirmation of a V17 with a repeat of [Return of the Sleepwalker](https://climbing-history.org/climb/1116/return-of-the-sleepwalker) sometime this year...(fingers crossed)
# How Many Men Can Climb V15 or Higher? {#howmany}
```{r, echo=FALSE, warning=FALSE}
uniquebygrade <- mydata %>% count(Grade, Name, sort=TRUE) %>% count(Grade, sort=TRUE)
ggplot(uniquebygrade, aes(x=Grade, y = n)) + geom_bar(stat="identity", fill="blue", width=0.3) +
geom_text(aes(label=n), position=position_dodge(width=0.9), vjust=-0.25, size=3) +
ggtitle("Unique Ascentionists by Grade") +
labs(y="Number", x = "V Grade")
#ggsave("images/Uniquebygrade.png", width = 20, height = 20, units = "cm")
```
```{r, echo=FALSE}
uniquebygrade <- uniquebygrade %>% arrange(Grade)
```
At the moment, there are more than 200 climbers in the world that have sent V15. After which there is a steep drop off, with `r uniquebygrade[2,2]` unique climbers having sent V15/16, `r uniquebygrade[3,2]` having sent V16, and `r uniquebygrade[4,2]` and `r uniquebygrade[5,2]` having sent V16/17 and V17, respectively.
With hard boulders, downgrading is common, as new climbers come along and find better/easier beta. Nalle wrote a fantastic [blog post](https://nalle-hukkataival.blogspot.com/2010/03/bouldering-grades-everything-is-average.html) back in 2010 giving his thoughts on hard boulder grades.
# Which Countries Have the Hardest Boulder Problems? {#whichcountries}
```{r, echo=FALSE}
countrycounts <- table(mydata$Country)
countrycounts <- countrycounts[countrycounts > 12]
ggplot(as.data.frame(countrycounts), aes(x=reorder(Var1, -Freq), y = Freq)) + geom_bar(stat="identity", fill="blue", width=0.5) + theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) +
ggtitle("Number of Hard Sends by Country") +
labs(y="Number", x = "Country")
#ggsave("images/NumberbyCountry.png", width = 20, height = 20, units = "cm")
```
The Top 5 Countries with the hardest sends are Switzerland, the United States, France, Japan, and South Africa.
# What About Age? {#age}
What is the age of strong male climbers today?
```{r, echo=FALSE, message=FALSE, warning=FALSE}
climbersagenow <- mydata[,c(2,11)]
climbersagenow <- climbersagenow[!duplicated(climbersagenow$Name), ]
climbersagenow$Birthday <- as.Date(climbersagenow$Birthday, format='%m/%d/%Y')
climbersagenow <- climbersagenow %>% drop_na()
age <- function(dob, age.day = today(), units = "years", floor = TRUE) {
calc.age = interval(dob, age.day) / duration(num = 1, units = units)
if (floor) return(as.integer(floor(calc.age)))
return(calc.age)
}
my_binwidth<-1
climbersagenow$age <- age(climbersagenow$Birthday)
ggplot(climbersagenow, aes(x=age)) +
geom_histogram(binwidth=my_binwidth, colour="black", fill="blue")+
geom_density(aes(y = ..density.. * (nrow(climbersagenow) * my_binwidth)), col = 2, alpha=.2, fill="#FF6666")+
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) +
ggtitle("Strong Male Climbers Age Today") +
labs(y="Count", x = "Age Today")+
scale_x_continuous(breaks=seq(10,60,5), limits=c(10,60))
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
```
The mean, median and mode age of strong male climbers today is `r round(mean(climbersagenow$age))`, `r round(median(climbersagenow$age))`, and `r getmode(climbersagenow$age)`, respectively.
The youngest V15 climber today is `r min(climbersagenow$age)` years old.
The oldest V15 climber today is `r max(climbersagenow$age)` years old.
## What About Stats on How Old They Are When They Sent?
```{r, echo=FALSE, message=FALSE, warning=FALSE}
climbersage <- mydata[,c(2,7,11)]
climbersage$Date <- as.Date(climbersage$Date, format = '%Y-%m-%d')
climbersage$Birthday <- as.Date(climbersage$Birthday, format = '%m/%d/%Y')
climbersage <- climbersage %>% drop_na()
climbersage$age <- age(climbersage$Birthday, climbersage$Date)
ggplot(climbersage, aes(x=age)) +
geom_histogram(binwidth=my_binwidth, colour="black", fill="blue")+
geom_density(aes(y = ..density.. * (nrow(climbersage) * my_binwidth)), col = 2, alpha=.2, fill="#FF6666")+
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) +
ggtitle("Strong Male Climbers Age When They Sent") +
labs(y="Count", x = "Age")+
scale_x_continuous(breaks=seq(10,60,5), limits=c(10,60))
```
The mean, median and mode age of strong male climbers when they sent is `r round(mean(climbersage$age))`, `r round(median(climbersage$age))`, and `r getmode(climbersage$age)`, respectively.
The youngest age to have climbed V15 or higher is `r min(climbersage$age)` years old.
The oldest age to have climbed V15 or higher is `r max(climbersage$age)` years old.
# Climber's Height {#height}
```{r, echo=FALSE, message=FALSE, warning=FALSE}
climbersheight <- mydata[,c(2,12)]
climbersheight <- climbersheight %>% drop_na()
climbersheight <- as.data.frame(unique(climbersheight))
my_binwidth <- 0.025
ggplot(climbersheight, aes(x=Height..m.)) +
geom_histogram(binwidth=my_binwidth, colour="black", fill="blue")+
geom_density(aes(y = ..density.. * (nrow(climbersheight) * my_binwidth)), col = 2, alpha=.2, fill="#FF6666")+
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) +
ggtitle("Strong Male Climbers Height") +
labs(y="Count", x = "Height (m)")#+
#scale_x_continuous(breaks=seq(10,60,5), limits=c(10,60))
```
The mean, median and mode height of strong male climbers is `r round(mean(climbersheight$Height..m.),2)`, `r round(median(climbersheight$Height..m.),2)`, and `r getmode(climbersheight$Height..m.)`, respectively.
The shortest height to have climbed V15 or higher is `r min(climbersheight$Height..m.)` meters.
The tallest height to have climbed V15 or higher is `r max(climbersheight$Height..m.)` meters.
<br />
<br />
*In order to create this list, I first copied Mr. Beale's list. Then, realizing that [scraping](https://github.com/vishaalagartha/8a_scraper) [8a.nu](https://www.8a.nu/) is against their terms of service, I simply clicked on their 'Ascents' tab, clicked 'Bouldering' for the discipline, filtered grades from 8c and higher, and copied the table:*
![8a.nu filter](images/8a.png)
*However, not all athlete's record their bouldering ascents in 8a.nu (Alex Megos being one example). Another great resource was [https://climbing-history.org/](https://climbing-history.org/), where oftentimes searching for a popular boulder problem would reveal additional sends not listed in 8a.nu.*
*Finally, I then tried to standardize all entries (James Webb vs. Jimmy Webb), remove errors, and add in send dates. Ultimately this is still a work in progress, and if you see any errors, please reach out.*
*Special shout-out to Andrew Leyland for extensive help in filling out the spreadsheet. And for those curious, I used [this tutorial](https://resources.github.com/whitepapers/github-and-rstudio/) to create this site.*