 I believe you can answer your own data analysis questions. Do you? If you do, stick around for another edition of Code Club. I'm your host, Pat Schloss. And my goal is to help you to grow in conference to ask and answer questions about the world around us using data. This week, I'll show you how you can use the read sheet function from the Google Sheets 4 package, along with the GM line and GM smooth functions from the GG Plot 2 package to look at trends in lamb sales here in Southeastern Michigan. On our farm, I have about 40 youths. These are female sheep that we keep year after year to produce more sheep. Most sheep are born between January and May and sold in the following fall. Those animals that are under a year old are called lambs and are generally sold when they're about 60 to 130 pounds. This is generally what we eat. In the United States, anything older is considered mutton and has a bit of a off flavor with it that some people don't really like. Because mutton was often sold as lamb, lamb consumption really fell off through the 1900s relative to other animal proteins, like beef, pork, and chicken. Surprisingly, most of the lamb that Americans eat is actually from Australia and New Zealand, not the United States. So to counteract all these trends, the lamb industry has made a big push for producers to increase the size of their flocks to help grow the industry. So I was wondering, has this been effective? Also, what effect has COVID-19 had on the overall numbers of lambs sold? Over the past five years, my local livestock auction in Manchester, Michigan, has been posting the number of lambs they have sold along with the price range for various sized lambs and older sheep. When the new data are posted each week, I copy the data into a Google Sheet so that I can look for trends in things like the number of lambs sold and when I can get the best prices. Now, the USDA also posts these types of data for larger markets, but because I live about 30 minutes from Manchester and they cater to a unique blend of traditional and Muslim markets, I'm really more interested in that local data. For today's Code Club, we'll use the Google Sheets 4 package to read that spreadsheet and we'll see how we can use functions from the GG Plot 2 package to plot the data. I've become a big fan of Google Sheets because I can look at any of my sheets on my phone and I can enter data on the phone too. Also, if you use Google Forms, you can export a Google Sheet from the form. This can be handy if you're collecting data in the field or from research subjects and you want the types of answers they give to be constrained. That we can use R to analyze the data makes it all the better. So don't watch the video straight through without first firing up our studio and trying the code and exercises yourself. Let's go ahead now and head over to the Code Club page for today which is hosted at the Riffamonus website at riffamonus.org. Before we get going, I want to show you the data that we're going to be working with for this exercise. And so here's my Google Sheet. It's called lamb prices. I've given you the link so anybody that has the link can view it but you can't edit it. At least I hope you can't edit it. And so you'll see that the first column is the date, the second is the total number of animals sold that week and then we have the different size classes or types of sheep being sold and the range of prices. And these prices we're not going to deal with this week but just so you know are dollars per hundred pounds. So this 180 to 220 means $1.80 to $2.20 per pound or $180 per hundred pounds. So where am I getting this from? Well, if I open this up and go to uproducers.com and then click on market results, this pulls up market results and I've been here enough times that it knows me but I'm going down and choosing Michigan, Manchester, Michigan. And so these are the data that come up every week and you can kind of see here in the Choose Your Archive that we could pick any week. So here's March 21st of 2016. We see that they sold 1,544 lambs and here's all the price data. So if I had better web parsing skills, we could probably use one of ours other packages to go through and pull together all these data for the different weeks. But I kind of like going in every week and looking at the data and getting kind of messy with the data but it would certainly probably be much more reproducible if I had a web scraper do this. The other thing I worry about is that United Producers at some point might decide they don't really want to keep updating this website. So if they get rid of the website then I'm out of data. So I kind of like having my own copy anyway. So again, this is the spreadsheet that we're going to be reading in. You'll notice it has two tabs, numbers and prices and holidays. There is a suspicion I think founded that lamb prices vary by different holidays where people are more likely to perhaps eat lamb. So we just came out of Id al-Fitr, the end of Ramadan where there was a lot of lamb consumed by people in the Muslim faith community. And so you might think that lamb prices might go up where there might be more lamb sold directly before that holiday or before these different holidays or traditionally at least people eat lamb. It probably isn't that simple. So anyway, how do we do this? So let's go now to our studio. And to get going in our studio, we need to first, as we always do, load the tidyverse package, so library tidyverse. So that will load. To use the Google Sheets functionality, we need to install a package called Google Sheets 4. And so we'll do Google Sheets 4. And so this takes a little bit to do. If you get an error that it can't find Google Sheets 4 for your version of R that you're running, maybe try changing the source of where you're getting that from. I'm getting mine from RStudio. And you can set that by going up to, not system preferences, but RStudio preferences, and then clicking on packages and then changing this to perhaps the global RStudio one. Sometimes when there's a new version of R released, it takes a little bit of time to get all the packages updated. Anyway, so we've got that. Another package that you might need is called HTTPUV. When I was working with this in the past, I've had errors come up where it's looking for that. So just in case, we'll do install.packages.htpuv. It'll install this. And so we're good to go. So now we can do library Google Sheets 4. And it loads that up for us. Great. So the next thing we wanna do is we're gonna read in the data from Google Sheets into our current instance of R. To do that, I need to get the link for this spreadsheet. So I'll go ahead and copy this and come back to RStudio. And I can then do, I'm gonna open up a script because I don't wanna have to keep copying and pasting this long URL, but this is the long URL. And so what the function's gonna need is this string but it's smart enough that we don't have to pull out that string, it will give it the whole thing. So to get this to work, we need to use a function called read underscore sheet. And the argument we're gonna give it is the URL of where the spreadsheet is. And we'll wrap that in quotes. And so if you then run that, you'll get a dialogue in text here. So I've used this before and so it kind of knows some of my Gmail accounts, my personal Gmail account as well as my Gmail account through University of Michigan. And so it's saying which one do you wanna use? Well, because I'm showing you how this all works, I'm gonna press zero because I suspect you probably don't have an account loaded that Google Sheets knows about. So if I type zero, this then opens up my web browser and it tells me to choose an account to pick from. And so I'll click on this one and it grants tidyverse API packages permission to see, edit, create, delete, whatever in your Google Drive. I will allow this and I'll allow that. So it's authentication complete. Please close page and return to R, okay? So now I'm back at R and you can see that it read it in. Now we only have to do this authentication procedure once per session of running R. Very good. So we've read in the spreadsheet and we can see that we have a new data frame. But something that kind of sticks out to us is that, at least to me, that some of the formatting is a little bit odd. There's extra columns in here that I perhaps don't really wanna worry about. Something I noticed is down here, there's a column that I'm not really sure where that came from. So we're gonna go through a few steps here to clean this up and to get it into a position we're now ready to plot the data. And so the first thing I'll think about is how do we deal with this last column of dot dot dot one? And so I'm kinda curious, well, what is that column? Because I have lambs larger than 131 pounds but what's after that? So if I come back to my Google Drive sheet, I'll see that the last column here in column J is those lambs larger than 131 columns but I also have this column K which has information about different holidays or more recently I've been putting in here that COVID's been going on and that might be wrecking havoc with the land market. Okay, so what I'd like to do is to constrain it to columns A through J. To do that, I can use an argument range. And range will take a string of either cells, ranges of cells, specific cells, or ranges of columns and probably even ranges of rows but we'll do columns here. So if we do A colon J because I wanna leave out column K, this runs and it tells us or shows us that the last column it read in was this greater than 131 and we no longer have that dot dot dot 11 column. So that's cool. So say we wanted a different range. So say we wanted say like from cell A1 to cells C10. Well, we could do that again with the range argument and we then see that we've got a subset from cells A1 to C10, okay? So I don't want that. And to keep things simple, I'm gonna actually do A to B. So I'll get columns A and B and that works. So now I've got a simplified data frame but it looks pretty weird, right? I've got a date column and I've got a total column which is what I expected but the values in here are kind of weird, right? So it's like my date, which we talked about dates last week but it's throwing on some time in here which is not necessary and looking at the type here DTTM that's a date and time variable type. In my total column, I would expect this to be a number, right? Like not a list and certainly not this weird syntax. I would expect it to be various numbers that we saw when we were looking at the webpage. So to fix this, what we need to do is we need to tell, read sheet what types of columns we have for our data. And so we can do this with the argument call type, call types and we can give this a string where the string is as long as the number of columns we have and the string then is made up of a one letter code denoting the type of data in each column. So for example, the first column is a date, so not date time, so date is denoted by a capital D. The second column is a double or numerical so we'll use a lowercase D for double. And we run that and we see that we have date and total and that sure enough, we got rid of that list thing or that weird thing. If you're curious what other types of codes are available, you could do question mark, read underscore sheet. And as you scroll down through here, this is the documentation for read sheet, you will find a section on column specification where it tells you the types of one letter codes and what they correspond to. So an L is for logical, I for integer, D or N for numeric, capital D, date and so forth, C for character. So that's really useful and really powerful. Something I'm noticing though is that there were 45 warnings, use warnings function to see them. So if I type warnings, I see I have the same warning message 45 times and it's not super helpful, but it's saying in primitive as double x, NA is introduced by coercion. So I think this is happening because read sheet doesn't know what to make of my NA values. If you look back at my Google sheet, you'll notice that I have, I have all the rest of the year populated in here, but I have NA values for where I don't have the data yet. And so it's probably complaining about that. And so what I can do is if you look at the read sheet arguments, there is a argument called NA. And so it's saying character vector of strings to interpret as missing values. By default, blank cells are treated as missing data. So I used NA, but it's expecting a blank cell. So I can add in here NA equals, and then in quotes, capital NA, which was what I used to indicate missing data. And now if we run this, we see that we get no warning messages and a nice looking data table with 279 rows and two columns. Now I should step back and also point out that the reason this works is because I have made my document readable to anybody with the link. You can't edit it, but you can read it, right? And so you might have your own sheets that you want to keep secure. And so that would totally work with this approach. Now, we've done perhaps a little bit more than we really needed to do, and there's a function called GS4DAUTH. And what this does is this tells Google Sheets don't worry about authentication because this is a public document. And so I should have mentioned this before when we were reading this in, but I wanted to show you how you would use it in a more realistic case. So for this situation, where you're using data that someone else provides and they're posting on Google Drive, their Google Drive and opening it up to anybody, then you could use GS4DAUTH and you don't need a Google account. You don't need to worry about the tokens and kind of logging in or things like that to get this to work. So then that would run and that would run and it doesn't worry about passwords or what account you're using. But again, I think in most applications of where you would be using a Google Sheet, you would want to be going through the authentication. So the next thing we might wanna do is that we've got this cleaned up data, we might wanna save it back to our Google Drive. And so you won't be saving it to my Google Drive, you'll be saving it to your Google Drive. So to do this, you naturally are gonna need a Google account. Google accounts are free and I think they're pretty worth having. So to do this, the argument or the function that we would use is gonna be write underscore sheet. And to do this, we need to save our data frame as a variable. And so I'm gonna call this sheep numbers, save that. And again, if I look at sheep numbers, if I spelled right, I haven't got a heck of a time with typos today, that's my data frame. And then I can do write sheet, sheep numbers. And if I run that, it's complaining that package IDS was installed before R4.0.0, please reinstall it. So I've never seen this before, even as I was kind of making sure all this stuff worked. So if you run into a problem, that's cool. Install.packages, IDS, it'll run. And next time it should be fine. But again, I'll do write sheet, sheep numbers. And so it's saying that because I deauthenticated, it's now missing invalid or I have an expired token. Okay, so to get through that, I need to do GS4 off and allows me to again do this authentication. So this time around, I'm gonna do one. I'm good. And so now I should do write dot write underscore sheet. And so you'll see that this is creating a new sheet, Suburban Phoebe. That is the name of the spreadsheet that it's creating. So if I go back to my Google Sheets and look at the sheets I have, I see that I have a sheet now called Suburban Phoebe. And that opening this up, sure enough, I see the data. Well, I don't want it to be Suburban Phoebe. Maybe I want it instead to be lamb numbers or sheep numbers. So I can create a spreadsheet, call it sheep numbers. And then what I'll do is I'll grab the URL for this new spreadsheet. And I will then do write sheet, sheep numbers. And then I'll use SS as the argument and I'll paste in the URL where I want it to go. And so this writes sheep numbers to the Google Sheet sheep numbers. And if I now look at my Google Doc, I see that I have a tab called sheep numbers. And there we go. The data are here. And I can get rid of this empty sheet by deleting that sheet. So again, we've been able to read from a Google Sheet and now write to a Google Sheet. So usually I'm reading, I'm not typically writing to a Google Sheet, but know that you can go both ways. There's also a lot more that you can do. There's a package called Google Drive that Jenny Bryan developed. She's also the developer of Google Sheets 4. And there's a lot you can do with those packages to kind of treat your Google Drive kind of like a drive that's actually on your local hard drive. So it's pretty slick and pretty helpful. Excellent. So what we're gonna do now is transition to thinking about, well, how can we plot these numbers? So to make a plot in R, we're gonna use ggplot2. There's other tools for building plots in R, but many of us find ggplot to be kind of the easiest and most, in some ways, I guess that's not perhaps the most powerful, but very powerful way of building plots without having a whole lot of baggage of having to remember all sorts of syntax that frankly doesn't make a lot of sense. So ggplot is really easy to use. They're much easier to use. I shouldn't say it's easy, but it's what I use for my own professional work. So to do it, we need to use a function called ggplot. So ggplot is a function that creates the plot for us. And we give it two arguments, a data argument and a mapping argument. And generally, we don't write out those arguments. So we'll say ggplot sheep numbers. And then for the mapping, the mapping is kind of a different way of thinking that we have our data frame of date and total number of animals in the two columns. And what we wanna do is map those two columns, one, the date to the x-axis, the other, the total to the y-axis. And then I'd like to have a line plot. So to do this, we can do aesx is the variable or what we're gonna call an aesthetic. So that's what aes is short for. So we're gonna map the data column, I'm sorry, the date column to x. And to the y column, we're gonna map total. And so if we run this, looking in the bottom right corner of our page now of our studio, we see a blank plot that has the x-axis labeled as date, the y-axis labeled as total, and we have this gray background with white grid lines. So one of the things that's cool about ggplot is that it thinks of a plot as a series of layers where you're layering different things on top of itself. And to add a layer, we use the plus sign. And so this is a different way of thinking about addition, but we can add now a visualization layer onto it or what's called a geome, G-E-O-M. And there are many geomes, as you can see from this help dialog that pops up, but the one we're gonna use is geome line. Perhaps in future code clubs, we'll see how to use some of these other geomes. So now if we run these two lines, we now get our line plot in the bottom right corner. Pretty slick, right? So, and we get a couple of warnings that are removed 30 rows containing missing values. Again, those are gonna be those NA values that it's not plotting. There were also weeks to weeks where for whatever reason United Producers did not post data for that week. So this is pretty slick, right? So we've seen this before in a previous code club where we talked about themes, but I'm gonna add a theme classic to give it a little bit of a cleaner look, in my opinion. And so we got rid of the gray background and we have kind of a minimalistic set of axes. But again, it's addition because it's adding different layers or different ways of thinking about what we're visualizing on the plot. Very good. So this is a black line. Maybe we'd like to style it up a little bit and make it look a little bit nicer. So what we can do is there are other aesthetics that are available with geome line. And so if I do help geome line in this help page, if I go down far enough, there's a section called aesthetics. And where is it? Here we go. So geompath, which is another version of geome line understands the following aesthetics. X, Y, alpha, which is like kind of the transparency of the line. Color, the color group, line type. So whether it's solid or dashed or what kind of dashing size or the thickness of the line. So for today, we're gonna talk, well, we've talked about X and Y, but we'll also talk about color and size. And so the developer Hadley Wickham, the original developer of GG plot is from New Zealand. So a lot of his spelling is British English, but you don't need the U in color if you speak American English like me. Anyway, so what's like I said, we're gonna talk about color and size. So let's add color red. And so this will then generate a red plot. And so to get other colors, there's actually a function called colors that when you run it, you get a listing of 657 different named colors. And just as I used red here, you could put in other colors here. So let's see steel blue. And so I get this other steel blue color. Alternatively, you can use hexadecimals. So there's a lot of palette color selectors online that you can use to pick complementary and contrasting colors. And so this is like a six digit code. So I'm just gonna make something up. I have no idea what this looks like. Something like this. And so it's kind of a purplish color that this hexadecimal gives. I kind of like Dodger blue. So I'm gonna stick with that. Okay, the other thing we can do is change the thickness of the line. So we can say size equals two. And so this then will make our line really thick, okay? The default size is I believe 0.5, okay? That's about what we had before. And so maybe one would be a good thickness. Or maybe the default, yeah, it was 0.5. So we can also make it thinner, right? So we can make it really thin with like 0.1, right? Okay, so I'm gonna go with one because I think that was a decent thickness. It's bold, right? And we can then add color to this to do Dodger blue. So we have a thicker, and that is kind of overly thick, but it's okay. It illustrates the point of modifying the line thickness here, okay? So like I said, there's other aesthetics that you can modify. We'll talk about these in future code clubs, but feel free to dig into them and see what things like line type or what alpha do to your plot. So this data is pretty noisy. My eye wants to see kind of a hump here, that it went up from 2016 through 18 and then down over the last couple of years. But I don't know, right? And so to get a better sense of that, there's a function we can use called geomsmooth. So it's another geom. And what this adds is a solid line, a fit line through the data. And it tells us here that it's using a loss model to fit Y against X. And so we see that blue line through there. And maybe I'd like to make it pop a little bit more. So again, we've got different aesthetics that are available for geomsmooth. So we could say color equals red. And that will make my line going through the plot then red. And again, we could also make our size thicker to make it clear what's going on, right? So again, we can use geomline and geomsmooth to fit a line through those data. You can also fit a linear, a line line, a straight line through the data, but that's a little bit beyond where I want to go today. So to make this look a little bit more presentable, I wanna make the ragged data a little bit more muted in color and make the fit line a little bit bolder. So it contrasts a little bit more. So I'm gonna do size 0.2, color, I'm gonna make gray. And maybe I'll make my fit line Dodger blue and the size two, right? So you can see I've got the solid line going through the data. And if we look at geomsmooth help page, one of the arguments that you'll see in here allows you to modify how squiggly that curve fit is. And so the argument is span, which controls the amount of smoothing for the default low smottle smoother. So smaller numbers produce more wigglier lines, larger numbers produce smoother lines. Cool. So let's add to that span equals one. And so you see this is actually a little bit smoother than what we had by default, whereas like 0.1 is more squiggly, right? And I think if we do something like 10, it's not that much different really from one. So it does have maybe a slight rise, but it seems pretty flat from 2015 to 2018. And then it falls off through 2020. So I think this big initiative to grow the lamb industry, I mean, they're always talking about it, but the big promotional push was actually perhaps kind of between 2015 and 2018. So perhaps it was effective, but when they laid off that, then lamb numbers and other factors caused things to drop. And certainly COVID has been kind of this part of the curve, but things have been falling off for a while, right? So again, I have a set of exercises for you to engage with now. I hope you found this useful. There are a number of things that we might think about updating or changing on this figure, things like a title, things like caption. We could talk about those in future code clubs, but I think this is a pretty presentable figure. And so again, I'm gonna have you make your own figures, read another Google sheet, perhaps write a Google sheet to give you a sense of how to engage with these functions on your own. I hope you found those exercises engaging. We're gonna go ahead back to RStudio now, where I've copied the exercises from the Riffamonus website into the RStudio document that we were already working on. And so you can see here are the four questions. And so what I'd like to do is go through these with you to help you see how I would do them. Some of them you might notice got a little bit more challenging in drawing upon information from previous code club sessions. For the first exercise, I'm asking you to run a code chunk that looks a lot like some of the code chunks we analyzed in previous code clubs where we were looking at historic weather data from Ann Arbor, Michigan. What I want you to do is download this data using the code chunk here. We're gonna look at one year's worth of data to keep the data a little bit smaller. 1976, year I was born. Seems like about as good as year as any. And so I'm gonna go ahead and run all of this. And if we look at AA weather, we see that sure enough all the data is from 1976. I then wanna use write underscore sheet and we'll write AA weather. And then SS equals something. And so we need to go ahead and create a blank workbook in our Google Drive. I will go ahead and save this as weather. And I'll copy the URL into the SS argument between the quote marks. I run this, it's writing to weather, writing to sheet AA weather. And if I look back at my workbook, sure enough now I have a tab in there for AA weather and I can get rid of that sheet one. I don't need it. So again, this is gonna be a version of a sheet that's unique to you and your account because we haven't done anything about the permissions. Very good. Moving on to the second exercise. Look at the help page for GM Smooth and see if you can figure out how to get rid of the confidence interval around the curve and how you can make the curve a different color. I'm gonna go ahead, back up here and grab what we had to generate this plot that I have in the bottom right corner. And what I'm talking about is this gray cloud around my blue line, I wanna get rid of that because I think it kinda detracts and I'm not really sure that anybody's gonna know how to interpret that. So if I do question mark GM Smooth, what I wanna do is look for an argument that talks about that confidence interval. So there's mapping, data, position, no. The method of smoothing, no, formula SE, ah. Display confidence interval around Smooth. So it's true by default, level to control. So by default, it's a 95% confidence interval but if we wanna get rid of it, we can use SE equals false. And so we will give this as an argument to GM Smooth. So let's say SE equals false, run that and sure enough, our cloud is gone. All right, so this gets into some of the problems that are a little bit harder now and relying on experience from previous code clubs. So find and plot the total number of lambs sold in each year that I have data. So we don't want just by week, which is what we're plotting here in this plot but we want it by year. So I'm gonna come back up to where I define sheep numbers. So I have sheep numbers and I have a hint here that you can use the year function from the lubricate package to get the year from a date. So again, I already loaded lubricate but just for good measure, sheep net numbers. I'm gonna go ahead and create the year column which we do with the mutate function year and the hint was to use the year function to get the year from the date. So we can use year and then date. And what we see when we run this is that we now have a data frame that's got three columns, the date, the total and the year. I wanna group by the year, summarize, make total sheep and that's gonna be sum of total. Let me do annual total. And so again, we get these NA values. So we need to do NA.RM equals true. And so those go away. And so this is what we've got. So I'm noticing in this data frame that I have rows obviously for 2015 and 2020 and I only had partial data for those years. So I'm gonna go ahead and use filter to say annual total, or just sorry, to say year not equals to 2015 and year not equal to 2020. And so that gets rid of those first and last rows. I can then plot this AES. So I don't need to put in the name of the data frame because that's getting piped in. AES X is gonna be the year, Y is gonna be the annual total and then I can do geom line and voila, we see that falling off. We could do things like changing the Y axis to include zero or whatever. We could change the theming, go crazy. But the key here again was to see how we could take data from some of the summarize, group by summarize and filtering and use that to pipe into building a plot with GG plot. Good job. All right, so this one's harder yet. So I have another workbook that I've made accessible to you all. And this is called, I believe I've called it Sheep Records Public. It's in the notes or in the tutorial webpage. So it's Sheep Records Public. And so I'm gonna copy this URL and we will then do read sheet. So that document, but I want the weights tab. The weights of the sheep on my farm that I measure periodically. So the longest serving you that I have on my farm has the ear tag 1211. She was born in 2012. She was about eight years old, doing a great job. So I'd like to plot her weight over time. So if I look at my Google Sheet, I see that I have a tab down here at the bottom called weights. And so I'm going to go ahead and add the argument sheet equals weights. We'll run this and see what we get back. And we're getting kind of that same funky formatting. And so we will add call types, and so we'll say we could do D for double, capital D for date, C for type, and then double for weight. And that looks pretty good. Let's look at the warnings. And again, we have this problem with the NAs. So we'll do NA equals quote NA. We're still getting some warnings. I'm not sure why that is, but I'm gonna go ahead and ignore that for now. I'm not quite sure what's going on. And I will rerun this and save it as a variable called weights, the parentheses, we get that, very good. And so then I can do weights, filter, ear tag, N equals equals 12, 11. This gets me all the data. I have 40 rows of data for 12, 11. And I can then do ggplot, x equals date, y equals weight, this is in pounds, plus geomline. And so I forgot to put x and y in the AES function. And so you'll get this error that says geomline requires the following missing aesthetics, x and y. And I said, well, I had x and y, but ah, I forgot to put them within AES. And now we're good to go. And so we see that this was her birth weight back in 2012, went up over time, and it's a little jagged because this say is the weight before she gave birth to lambs, and this is the weight after she had lambs. And so she kind of gains weight, loses weight, gains weight, loses weight, but seems to kind of converge to a kind of an average weight when she's not bred of about 160, 175 pounds, which is good. She's a great you, we love her a lot. Anyway, again, there's lots we could do to clean up these plots and make them look nice. What I wanted to get across to you in this exercise was really that again, we can read in from a sheet, we can do some modification with it, we can filter the data and we can plot it. Again, I find these Google Sheets to be really powerful in helping us to put data up virtually. I can record the weights like the weights you're using here while I'm out with my sheep, weighing them on a scale and put them literally into my phone can come in and build a plot like this when I'm sitting down at my computer. It's really nice. I don't need super fancy software. I need Google Sheets, which is free, and a little bit of know-how with R and RStudio and these two great packages, or I guess three, right? Of Google Sheets 4, LubaDate, and GigiPlot 2, and Deplier, so forth. Thanks again for joining me for this week's episode of Code Club. Be sure that you spend time going through the exercises on your own to help reinforce your new skills. Even better would be for you to take the data and tools we've worked on today and answer your very own questions. I'd love to see what you did. Please feel free to drop a line in the comments below to tell us what questions you were eager to answer. Also, please let me know what types of data analysis questions you have, and I'll do my best to answer them in a future Code Club. Please be sure to tell your friends about Code Club and to like this video, subscribe to the channel, and click on the bell so that you know when the next Code Club drops. They're coming out about every Thursday afternoon. Please keep practicing and we'll see you next time for another episode of Code Club.