# Matrices and Data Frames

swirl()

| Welcome to swirl! Please sign in. If you've been here before, use the same name as you
| did then. If you are new, call yourself something unique.

What shall I call you? Krishnakanth Allika

| Please choose a course, or type 0 to exit swirl.

1: R Programming
2: Take me to the swirl course repository!

Selection: 1

1: Basic Building Blocks 2: Workspace and Files 3: Sequences of Numbers
4: Vectors 5: Missing Values 6: Subsetting Vectors
7: Matrices and Data Frames 8: Logic 9: Functions
10: lapply and sapply 11: vapply and tapply 12: Looking at Data
13: Simulation 14: Dates and Times 15: Base Graphics

Selection: 7

| | 0%

| In this lesson, we'll cover matrices and data frames. Both represent 'rectangular' data
| types, meaning that they are used to store tabular data, with rows and columns.

...

|== | 3%
| The main difference, as you'll see, is that matrices can only contain a single class of
| data, while data frames can consist of many different classes of data.

...

|==== | 6%
| Let's create a vector containing the numbers 1 through 20 using the : operator. Store
| the result in a variable called my_vector.

my_vector<-1:20

| That's a job well done!

|======= | 8%
| View the contents of the vector you just created.

my_vector
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

| You got it right!

|========= | 11%
| The dim() function tells us the 'dimensions' of an object. What happens if we do
| dim(my_vector)? Give it a try.

dim(my_vector)
NULL

| Keep up the great work!

|=========== | 14%
| Clearly, that's not very helpful! Since my_vector is a vector, it doesn't have a dim
| attribute (so it's just NULL), but we can find its length using the length() function.
| Try that now.

length(my_vector)
[1] 20

| Excellent job!

|============= | 17%
| Ah! That's what we wanted. But, what happens if we give my_vector a dim attribute?
| Let's give it a try. Type dim(my_vector) <- c(4, 5).

dim(my_vector)<-c(4,5)

| That's the answer I was looking for.

|================ | 19%
| It's okay if that last command seemed a little strange to you. It should! The dim()
| function allows you to get OR set the dim attribute for an R object. In this case, we
| assigned the value c(4, 5) to the dim attribute of my_vector.

...

|================== | 22%
| Use dim(my_vector) to confirm that we've set the dim attribute correctly.

dim(my_vector)
[1] 4 5

| Great job!

|==================== | 25%
| Another way to see this is by calling the attributes() function on my_vector. Try it
| now.

attributes(my_vector)
\$dim
[1] 4 5

| Great job!

|====================== | 28%
| Just like in math class, when dealing with a 2-dimensional object (think rectangular
| table), the first number is the number of rows and the second is the number of columns.
| Therefore, we just gave my_vector 4 rows and 5 columns.

...

|======================== | 31%
| But, wait! That doesn't sound like a vector any more. Well, it's not. Now it's a
| matrix. View the contents of my_vector now to see what it looks like.

my_vector
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20

| You got it right!

|=========================== | 33%
| Now, let's confirm it's actually a matrix by using the class() function. Type
| class(my_vector) to see what I mean.

class(my_vector)
[1] "matrix"

| You are quite good my friend!

|============================= | 36%
| Sure enough, my_vector is now a matrix. We should store it in a new variable that helps
| us remember what it is. Store the value of my_vector in a new variable called
| my_matrix.

my_matrix<-my_vector

| That's correct!

|=============================== | 39%
| The example that we've used so far was meant to illustrate the point that a matrix is
| simply an atomic vector with a dimension attribute. A more direct method of creating
| the same matrix uses the matrix() function.

...

|================================= | 42%
| Bring up the help file for the matrix() function now using the ? function.

?matrix

| That's correct!

|==================================== | 44%
| Now, look at the documentation for the matrix function and see if you can figure out
| how to create a matrix containing the same numbers (1-20) and dimensions (4 rows, 5
| columns) by calling the matrix() function. Store the result in a variable called
| my_matrix2.

my_matrix2<-matrix(data=1:20,nrow = 4,ncol = 5)

| You are quite good my friend!

|====================================== | 47%
| Finally, let's confirm that my_matrix and my_matrix2 are actually identical. The
| identical() function will tell us if its first two arguments are the same. Try it out.

identical(my_matrix,my_matrix2)
[1] TRUE

| You are amazing!

|======================================== | 50%
| Now, imagine that the numbers in our table represent some measurements from a clinical
| experiment, where each row represents one patient and each column represents one
| variable for which measurements were taken.

...

|========================================== | 53%
| We may want to label the rows, so that we know which numbers belong to each patient in
| the experiment. One way to do this is to add a column to the matrix, which contains the
| names of all four people.

...

|============================================ | 56%
| Let's start by creating a character vector containing the names of our patients --
| Bill, Gina, Kelly, and Sean. Remember that double quotes tell R that something is a
| character string. Store the result in a variable called patients.

patients<-c("Bill","Gina","Kelly","Sean")

| That's correct!

|=============================================== | 58%
| Now we'll use the cbind() function to 'combine columns'. Don't worry about storing the
| result in a new variable. Just call cbind() with two arguments -- the patients vector
| and my_matrix.

cbind(patients,my_matrix)
patients
[1,] "Bill" "1" "5" "9" "13" "17"
[2,] "Gina" "2" "6" "10" "14" "18"
[3,] "Kelly" "3" "7" "11" "15" "19"
[4,] "Sean" "4" "8" "12" "16" "20"

| All that practice is paying off!

|================================================= | 61%
| Something is fishy about our result! It appears that combining the character vector
| with our matrix of numbers caused everything to be enclosed in double quotes. This
| means we're left with a matrix of character strings, which is no good.

...

|=================================================== | 64%
| If you remember back to the beginning of this lesson, I told you that matrices can only
| contain ONE class of data. Therefore, when we tried to combine a character vector with
| a numeric matrix, R was forced to 'coerce' the numbers to characters, hence the double
| quotes.

...

|===================================================== | 67%
| This is called 'implicit coercion', because we didn't ask for it. It just happened. But
| why didn't R just convert the names of our patients to numbers? I'll let you ponder
| that question on your own.

...

|======================================================== | 69%
| So, we're still left with the question of how to include the names of our patients in
| the table without destroying the integrity of our numeric data. Try the following --
| my_data <- data.frame(patients, my_matrix)

my_data<-data.frame(patients,my_matrix)

|========================================================== | 72%
| Now view the contents of my_data to see what we've come up with.

my_data
patients X1 X2 X3 X4 X5
1 Bill 1 5 9 13 17
2 Gina 2 6 10 14 18
3 Kelly 3 7 11 15 19
4 Sean 4 8 12 16 20

| You are doing so well!

|============================================================ | 75%
| It looks like the data.frame() function allowed us to store our character vector of
| names right alongside our matrix of numbers. That's exactly what we were hoping for!

...

|============================================================== | 78%
| Behind the scenes, the data.frame() function takes any number of arguments and returns
| a single object of class data.frame that is composed of the original objects.

...

|================================================================ | 81%
| Let's confirm this by calling the class() function on our newly created data frame.

class(my_data)
[1] "data.frame"

| Excellent work!

|=================================================================== | 83%
| It's also possible to assign names to the individual rows and columns of a data frame,
| which presents another possible way of determining which row of values in our table
| belongs to each patient.

...

|===================================================================== | 86%
| However, since we've already solved that problem, let's solve a different problem by
| assigning names to the columns of our data frame so that we know what type of
| measurement each column represents.

...

|======================================================================= | 89%
| Since we have six columns (including patient names), we'll need to first create a
| vector containing one element for each column. Create a character vector called cnames
| that contains the following values (in order) -- "patient", "age", "weight", "bp",
| "rating", "test".

cnames<-c("patient", "age", "weight", "bp", "rating", "test")

| Excellent job!

|========================================================================= | 92%
| Now, use the colnames() function to set the colnames attribute for our data frame.
| This is similar to the way we used the dim() function earlier in this lesson.

colnames(my_data)<-cnames

| Excellent work!

|============================================================================ | 94%
| Let's see if that got the job done. Print the contents of my_data.

my_data
patient age weight bp rating test
1 Bill 1 5 9 13 17
2 Gina 2 6 10 14 18
3 Kelly 3 7 11 15 19
4 Sean 4 8 12 16 20

| Excellent work!

|============================================================================== | 97%
| In this lesson, you learned the basics of working with two very important and common
| data structures -- matrices and data frames. There's much more to learn and we'll be
| covering more advanced topics, particularly with respect to data frames, in future
| lessons.

...

|================================================================================| 100%
| Would you like to receive credit for completing this course on Coursera.org?

1: No
2: Yes

Selection: 2
What is your assignment token? xXxXxxXXxXxxXXXx

| You got it right!

| You've reached the end of this lesson! Returning to the main menu...

| Please choose a course, or type 0 to exit swirl.

1: R Programming
2: Take me to the swirl course repository!

Selection: 0

| Leaving swirl now. Type swirl() to resume.

ls()
[1] "cnames" "my_data" "my_matrix" "my_matrix2" "my_vector" "patients"
rm(list=ls())

Last updated 2020-04-14 10:18:05.910590 IST