Answer the following questions.
These questions relate to the homework problem 12.2.1 Exercise 2. Use what you know from Chapter 13 to answer the questions for table4a and table4b.
- Using table4a and table4b from the tidyverse R package, merge the two dataframes into one and create a column, rate per 10000 variable, for each year.
library(tidyverse)
table4a
table4b
table_new2 <- table4a %>% inner_join(table4b, by = c("country"))
table_new2
table_new2a <- table_new2 %>% mutate(
rate.1999 = (`1999.x`/`1999.y`)*10000,
rate.2000 = (`2000.x`/`2000.y`)*10000
) %>%
select(country, rate.1999, rate.2000)
table_new2a
- Is your final dataframe for questions 1 tidy? Yes or no, explain.
Answer: No. The table_new2a is not tidy. The rates are in two columns.
- Convert your final dataframe for question 1 into a tidy dataframe with three columns country, year and rate.
Answer: Gather the columns into year and rate columns.
table_new2a %>% gather(rate.1999, rate.2000, key = "year", value = "rate")
- Make a clustered bar graph displaying the data.
Note the use of the as.factor() function.
table_new2a %>% gather(rate.1999, rate.2000, key = "year", value = "rate") %>%
ggplot(aes(x = as.factor(year), y = rate, fill = country) ) +
geom_bar(position="dodge", stat="identity")
![](data:image/png;base64,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)
The next question relates to Chapter 14.
library(stringr)
For the string “Today is the second quiz.”
Use an str_? R function to count the length of the string.
Use an str_ R function to change all of the letters to lower case.
Use an str_? R function to subset the string into separate words.
x <- "Today is the second quiz."
x
[1] "Today is the second quiz."
# a.
str_count(x)
[1] 25
# b.
str_to_lower(x)
[1] "today is the second quiz."
# c.
str_split(x, " ")
[[1]]
[1] "Today" "is" "the" "second" "quiz."
LS0tCnRpdGxlOiAiUXVpeiAyIHByZXBhcmF0aW9uIHNvbHV0aW9uIgpvdXRwdXQ6CiAgd29yZF9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpBbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCgpUaGVzZSBxdWVzdGlvbnMgcmVsYXRlIHRvIHRoZSBob21ld29yayBwcm9ibGVtIDEyLjIuMSBFeGVyY2lzZSAyLiBVc2Ugd2hhdCB5b3Uga25vdyBmcm9tIENoYXB0ZXIKMTMgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbnMgZm9yICp0YWJsZTRhKiBhbmQgKnRhYmxlNGIqLgoKMS4gVXNpbmcgKnRhYmxlNGEqIGFuZCAqdGFibGU0YiogZnJvbSB0aGUgKnRpZHl2ZXJzZSogUiBwYWNrYWdlLCBtZXJnZSB0aGUgdHdvIGRhdGFmcmFtZXMgaW50byBvbmUgYW5kIGNyZWF0ZQphIGNvbHVtbiwgcmF0ZSBwZXIgMTAwMDAgdmFyaWFibGUsIGZvciBlYWNoIHllYXIuCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKdGFibGU0YQp0YWJsZTRiCmBgYAoKCmBgYHtyfQp0YWJsZV9uZXcyIDwtIHRhYmxlNGEgJT4lIGlubmVyX2pvaW4odGFibGU0YiwgYnkgPSBjKCJjb3VudHJ5IikpCnRhYmxlX25ldzIKYGBgCgpgYGB7cn0KdGFibGVfbmV3MmEgPC0gdGFibGVfbmV3MiAlPiUgbXV0YXRlKApyYXRlLjE5OTkgPSAoYDE5OTkueGAvYDE5OTkueWApKjEwMDAwLApyYXRlLjIwMDAgPSAoYDIwMDAueGAvYDIwMDAueWApKjEwMDAwCikgJT4lCnNlbGVjdChjb3VudHJ5LCByYXRlLjE5OTksIHJhdGUuMjAwMCkKdGFibGVfbmV3MmEKYGBgCgoyLiBJcyB5b3VyIGZpbmFsIGRhdGFmcmFtZSBmb3IgcXVlc3Rpb25zIDEgdGlkeT8gWWVzIG9yIG5vLCBleHBsYWluLgoKKipBbnN3ZXI6KiogTm8uICBUaGUgKnRhYmxlX25ldzJhKiBpcyBub3QgdGlkeS4gIFRoZSByYXRlcyBhcmUgaW4gdHdvIGNvbHVtbnMuCgozLiBDb252ZXJ0IHlvdXIgZmluYWwgZGF0YWZyYW1lIGZvciBxdWVzdGlvbiAxIGludG8gYSB0aWR5IGRhdGFmcmFtZSB3aXRoIHRocmVlIGNvbHVtbnMgY291bnRyeSwgeWVhcgphbmQgcmF0ZS4KCioqQW5zd2VyOioqICBHYXRoZXIgdGhlIGNvbHVtbnMgaW50byB5ZWFyIGFuZCByYXRlIGNvbHVtbnMuCgpgYGB7cn0KdGFibGVfbmV3MmEgJT4lIGdhdGhlcihyYXRlLjE5OTksIHJhdGUuMjAwMCwga2V5ID0gInllYXIiLCB2YWx1ZSA9ICJyYXRlIikKYGBgCgo0LiBNYWtlIGEgY2x1c3RlcmVkIGJhciBncmFwaCBkaXNwbGF5aW5nIHRoZSBkYXRhLgoKTm90ZSB0aGUgdXNlIG9mIHRoZSBhcy5mYWN0b3IoKSBmdW5jdGlvbi4KCmBgYHtyfQp0YWJsZV9uZXcyYSAlPiUgZ2F0aGVyKHJhdGUuMTk5OSwgcmF0ZS4yMDAwLCBrZXkgPSAieWVhciIsIHZhbHVlID0gInJhdGUiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcy5mYWN0b3IoeWVhciksIHkgPSByYXRlLCBmaWxsID0gY291bnRyeSkgKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKQpgYGAKClRoZSBuZXh0IHF1ZXN0aW9uIHJlbGF0ZXMgdG8gQ2hhcHRlciAxNC4KCmBgYHtyfQpsaWJyYXJ5KHN0cmluZ3IpCmBgYAoKNS4gRm9yIHRoZSBzdHJpbmcg4oCcVG9kYXkgaXMgdGhlIHNlY29uZCBxdWl6LuKAnQoKICAgIGEuIFVzZSBhbiAqc3RyXz8qIFIgZnVuY3Rpb24gdG8gY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgoKICAgIGIuIFVzZSBhbiAqc3RyXyogUiBmdW5jdGlvbiB0byBjaGFuZ2UgYWxsIG9mIHRoZSBsZXR0ZXJzIHRvIGxvd2VyIGNhc2UuCgogICAgYy4gVXNlIGFuICpzdHJfPyogUiBmdW5jdGlvbiB0byBzdWJzZXQgdGhlIHN0cmluZyBpbnRvIHNlcGFyYXRlIHdvcmRzLgoKYGBge3J9CnggPC0gIlRvZGF5IGlzIHRoZSBzZWNvbmQgcXVpei4iCngKCiMgYS4Kc3RyX2NvdW50KHgpCgojIGIuCnN0cl90b19sb3dlcih4KQoKIyBjLgpzdHJfc3BsaXQoeCwgIiAiKQoKYGBgCgoKCg==