Working with Lists in R

So far I have talked about data structures like Vector, Matrix and Data Frames. Another data structure, which allows us to put other structures in a given order is List. The best part about lists is that the elements of a list can be vector, matrix and data frames. And, they can be part of the same list.

Following example shows how to create a list consisting of a vector, matrix and data frame:

> vec.sample <-sample(10:99,30)
> mat.sample <- matrix(sample(10:99,30), nrow=5)
> df.mtcars <- mtcars
> new.list <- list(vec.sample , mat.sample, df.mtcars)
> new.list
[[1]]
 [1] 88 11 45 37 80 18 19 63 60 81 29 83 24 21 95 36 43 49 14 87 28 73 41 98 94 86 39 48 97 12

[[2]]
 [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 73 77 62 99 11 71
[2,] 32 82 41 79 37 35
[3,] 69 13 51 48 31 94
[4,] 39 63 65 17 78 74
[5,] 95 53 27 93 24 60

[[3]]
 mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

In the above example, all we did is to pass the data in different structure and create a list. You would like to note following:

  • The indices are inside double square brackets
  • The elements are shown one after another
  • The complete data elements of the lists are shown
  • As expected, the index values are assigned by default

List elements as tag and value pair

In the previous section, we just passed the data values to the list arguments. However, we can very well pass tags, which will enable us to access the elements using the desired name. Following example shows how to use the tags and how the tags replace the indexes:

> tagged.list <- list(vec=vec.sample, mat=mat.sample, data.frame = head(df.mtcars))
> tagged.list
$vec
 [1] 88 11 45 37 80 18 19 63 60 81 29 83 24 21 95 36 43 49 14 87 28 73 41 98 94 86 39 48 97 12

$mat
 [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 73 77 62 99 11 71
[2,] 32 82 41 79 37 35
[3,] 69 13 51 48 31 94
[4,] 39 63 65 17 78 74
[5,] 95 53 27 93 24 60

$data.frame
 mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

Accessing the List Elements

By now you must have guessed that you can use either the index notation or the $ notation to access specific element of a list. Following example shows the three different ways of accessing the list elements:

> tagged.list[[2]]
 [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 73 77 62 99 11 71
[2,] 32 82 41 79 37 35
[3,] 69 13 51 48 31 94
[4,] 39 63 65 17 78 74
[5,] 95 53 27 93 24 60
> tagged.list$data.frame
 mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
> tagged.list[['vec']]
 [1] 88 11 45 37 80 18 19 63 60 81 29 83 24 21 95 36 43 49 14 87 28 73 41 98 94 86 39 48 97 12

Updating an element of the list item

In the previous section, you learned how to access specific item of a list. You can extend the same and depending on the datatype of the given item, access the specific element of that item and update the same. Below example shows how you can modify specific element of a given item and specific column of a given item:

> class(tagged.list$data.frame)
[1] "data.frame"
> tagged.list$data.frame['Mazda RX4','wt'] <- 3.85
> tagged.list$data.frame[,'gear'] <- c(4,5,6,7,8,9)
> tagged.list$data.frame
 mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 3.850 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 5 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 6 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 7 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 8 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 9 1

Adding new item in a list

Like we did in the data frame, you can make use of index notation and/or $ notation to add additional items in the list. Following example shows couple of ways to add new items:

> tagged.list[['women']] <- head(women,n=5L)
> tagged.list$state.x77 <- tail(state.x77)
> tagged.list
$vec
 [1] 88 11 45 37 80 18 19 63 60 81 29 83 24 21 95 36 43 49 14 87 28 73 41 98 94 86 39 48 97 12

$mat
 [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 73 77 62 99 11 71
[2,] 32 82 41 79 37 35
[3,] 69 13 51 48 31 94
[4,] 39 63 65 17 78 74
[5,] 95 53 27 93 24 60

$data.frame
 mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 3.850 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 5 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 6 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 7 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 8 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 9 1

$women
 height weight
1 58 115
2 59 117
3 60 120
4 61 123
5 62 126

$state.x77
 Population Income Illiteracy Life Exp Murder HS Grad Frost Area
Vermont 472 3907 0.6 71.64 5.5 57.1 168 9267
Virginia 4981 4701 1.4 70.08 9.5 47.8 85 39780
Washington 3559 4864 0.6 71.72 4.3 63.5 32 66570
West Virginia 1799 3617 1.4 69.48 6.7 41.6 100 24070
Wisconsin 4589 4468 0.7 72.48 3.0 54.5 149 54464
Wyoming 376 4566 0.6 70.29 6.9 62.9 173 97203

Deleting an item

By assigning a NULL value to a given item or index, you can remove that item from the list, as shown below:

> tagged.list[['women']] <- NULL
> tagged.list$state.x77 <- NULL
> tagged.list
$vec
 [1] 88 11 45 37 80 18 19 63 60 81 29 83 24 21 95 36 43 49 14 87 28 73 41 98 94 86 39 48 97 12

$mat
 [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 73 77 62 99 11 71
[2,] 32 82 41 79 37 35
[3,] 69 13 51 48 31 94
[4,] 39 63 65 17 78 74
[5,] 95 53 27 93 24 60

$data.frame
 mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 3.850 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 5 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 6 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 7 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 8 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 9 1

Using the str function (for structure), you can confirm the deletion by seeing the structure of the list, as shown below:

> str(tagged.list)
List of 3 
$ vec       : int [1:30] 88 11 45 37 80 18 19 63 60 81 ... 
$ mat       : int [1:5, 1:6] 73 32 69 39 95 77 82 13 63 53 ... 
$ data.frame:'data.frame': 6 obs. of  11 variables:  
..$ mpg : num [1:6] 21 21 22.8 21.4 18.7 18.1  
..$ cyl : num [1:6] 6 6 4 6 8 6  
..$ disp: num [1:6] 160 160 108 258 360 225  
..$ hp  : num [1:6] 110 110 93 110 175 105 
..$ drat: num [1:6] 3.9 3.9 3.85 3.08 3.15 2.76  
..$ wt  : num [1:6] 3.85 2.88 2.32 3.21 3.44 ...  
..$ qsec: num [1:6] 16.5 17 18.6 19.4 17 ...  
..$ vs  : num [1:6] 0 0 1 1 0 1  
..$ am  : num [1:6] 1 1 1 0 0 0  
..$ gear: num [1:6] 4 5 6 7 8 9  
..$ carb: num [1:6] 4 4 1 1 2 1

Combining Lists

You can combine two or more lists using the c (combine) function using following statements:

combined.list <- c(new.list, tagged.list)

As expected, the output contains all the elements from all the lists. When you look at the structure of the new list, it will let you know the number of elements and their structure.

R_lists2

Lists of Lists

You can create more complex lists and come up with even more complex structure by assigning list itself as an element of a list. In below example, you can see multiple lists and other data structures being used to create a new list:

R_lists

You may like to note the indentation being used to show the elements of the inner list. This is where, the list looks like a very powerful data structure, which allows us to order and relate various different types of related data at a single place.

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s