Lists

When we work with a vector, all elements must be of the same type.For lists it is possible to works with elements od different mode.

Creating lists

Technically, a list is a vector. Ordinary vectors—those of the type we’ve been using so far in this book—are termed atomic vectors, since their components cannot be broken down into smaller components. In contrast, lists are referred to as recursive vectors. List has the advantages that allows you to work with different modes in one list. In this example for each employee, we wish to store the name, salary, and a Boolean indicating union membership.

m <- list(name="Peter", salary=33000, union=T)
m
$name
[1] "Peter"

$salary
[1] 33000

$union
[1] TRUE

In order to make reference to a component of the list. Using the name of the list, dollar symbol ($) and the name of the variable you want to know.

m$name
[1] "Peter"
m$salary
[1] 33000
m$union
[1] TRUE

General List Operations

List Indexing

Above has been shown how to access to a component of a list but there more ways to do it

m$name
[1] "Peter"
m[["name"]]
[1] "Peter"

it is possible to access component name of the list using its numerical index.

m[[1]]
[1] "Peter"

lst$c • lst[[“c”]] • lst[[i]], where i is the index of c within lst

Adding and Deleting List Elements

New components can be added after a list is created

n
$a
[1] "hello"

$b
[1] 23

Selecting the place this new component is going to be and the value it is going to have.

n
$a
[1] "hello"

$b
[1] 23

$c
[1] "bye"

It is possible to add components by the vector index.

n[[4]] <- 2
n[5:7] <- c(TRUE,TRUE,FALSE)
n
$a
[1] "hello"

$b
[1] 23

$c
[1] "bye"

[[4]]
[1] 2

[[5]]
[1] TRUE

[[6]]
[1] TRUE

[[7]]
[1] FALSE

So in the fourth component position number 2 is added and from position 5 to 7 is going to be TRUE, TRUE and FALSE respectively

In order to delete a list component, value NULL is added to the component.

n$a <- NULL
n
$b
[1] 23

$c
[1] "bye"

[[3]]
[1] 2

[[4]]
[1] TRUE

[[5]]
[1] TRUE

[[6]]
[1] FALSE

As could be seen in the output component “a” has been deleted.

R allows you to concatenate lists too.

c(list("Peter", 33000, T),list(5))
[[1]]
[1] "Peter"

[[2]]
[1] 33000

[[3]]
[1] TRUE

[[4]]
[1] 5

so a list with the number 5 has been added to the initial list

Getting the Size of a List

Since a list is a vector, you can obtain the number of components in a list via length().

length(m)
[1] 3
length(n)
[1] 6

Accessing List Components and Values

To found the names of the components, funftion names() is used.

names(m)
[1] "name"   "salary" "union" 

In this case the components with tags are name, salary and union.

In order to know the values of each of these components.

ulm
   name  salary   union 
"Peter" "33000"  "TRUE" 

The class of the unlist is character because one of the values is a character and just with one of the values being a character is enough.

class(ulm)
[1] "character"

By the way if all the values are numbers the output of class is going to be numeric

o <- list(a=13,b=56,c=3)
p <- unlist(o)
class(p)
[1] "numeric"
p
 a  b  c 
13 56  3 

However, if one of the components is a character and the rest are numbers, the class of the list is going to be Character

q <- list(a=13,b="hi",c=45)
r <- unlist(q)
class(r)
[1] "character"
r
   a    b    c 
"13" "hi" "45" 

Applying Functions to Lists

Two functions are handy for applying functions to lists: lapply and sapply.

Using the lapply() and sapply() Functions

lapply() functionn works for all values of the list and returns another list.

lapply(list(30:45,67:62,73:80),median)
[[1]]
[1] 37.5

[[2]]
[1] 64.5

[[3]]
[1] 76.5

In this case median is aplied to values between 30 to 45, 67 to 62,and 73 to 80. Then a list with the values of these medians has been created.

Sapply() function returns a vector or a matrix instead of a list.

sapply(list(30:45,67:62,73:80),median)
[1] 37.5 64.5 76.5

Extended Example: Back to the Abalone Data

Using lapply() function in an example for age.we wished to know the indices of the observations that were Old, Young, and Kid.

ag <- c("O","O","Y","Y","K","O","Y","K")
lapply(c("O","Y","K"),function(age) which(ag==age))
[[1]]
[1] 1 2 6

[[2]]
[1] 3 4 7

[[3]]
[1] 5 8

In that first case, the function calculates which(ag==“O”), giving us the vector of indices in ag of Old. After determining the indices for the Young and Kids, lapply() will return the three vectors in a list.

#####Recursive Lists Lists can be recursive, meaning that you can have lists within lists.

b <- list(k = 13, v = 99, z = 32)
c <- list(y = 45, h = 77)
a <- list(b,c)
a
[[1]]
[[1]]$k
[1] 13

[[1]]$v
[1] 99

[[1]]$z
[1] 32


[[2]]
[[2]]$y
[1] 45

[[2]]$h
[1] 77

Since a is composed of 2 lists its length is 2.

length(a)
[1] 2

This code makes a into a two-component list, with each component itself also being a list. The concatenate function c() has an optional argument recursive, which controls whether flattening occurs when recursive lists are combined

c(list(a=34,b=22,c=list(d=3,e=11)))
$a
[1] 34

$b
[1] 22

$c
$c$d
[1] 3

$c$e
[1] 11

In the above case, the default value of recursive has been accepted, which is FALSE, and obtained a recursive list, with the c component of the main list itself being another list

c(list(a=1,b=2,c=list(d=5,e=9)),recursive=T)
  a   b c.d c.e 
  1   2   5   9 

Now, writing recursive = TRUE, we got a single list as a result.

LS0tDQp0aXRsZTogIkxlY3R1cmU1X0FjdGl2aXR5OCINCmF1dGhvcjogIlJhdWwgUm9jZXMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIExpc3RzDQpXaGVuIHdlIHdvcmsgd2l0aCBhIHZlY3RvciwgYWxsIGVsZW1lbnRzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS5Gb3IgbGlzdHMgaXQgaXMgcG9zc2libGUgdG8gd29ya3Mgd2l0aCBlbGVtZW50cyBvZCBkaWZmZXJlbnQgbW9kZS4NCg0KDQoNCiMjIyBDcmVhdGluZyBsaXN0cw0KVGVjaG5pY2FsbHksIGEgbGlzdCBpcyBhIHZlY3Rvci4gT3JkaW5hcnkgdmVjdG9yc+KAlHRob3NlIG9mIHRoZSB0eXBlIHdl4oCZdmUgYmVlbiB1c2luZyBzbyBmYXIgaW4gdGhpcyBib29r4oCUYXJlIHRlcm1lZCBhdG9taWMgdmVjdG9ycywgc2luY2UgdGhlaXIgY29tcG9uZW50cyBjYW5ub3QgYmUgYnJva2VuIGRvd24gaW50byBzbWFsbGVyIGNvbXBvbmVudHMuIEluIGNvbnRyYXN0LCBsaXN0cyBhcmUgcmVmZXJyZWQgdG8gYXMgcmVjdXJzaXZlIHZlY3RvcnMuDQpMaXN0IGhhcyB0aGUgYWR2YW50YWdlcyB0aGF0IGFsbG93cyB5b3UgdG8gd29yayB3aXRoIGRpZmZlcmVudCBtb2RlcyBpbiBvbmUgbGlzdC4NCkluIHRoaXMgZXhhbXBsZSBmb3IgZWFjaCBlbXBsb3llZSwgd2Ugd2lzaCB0byBzdG9yZSB0aGUgbmFtZSwgc2FsYXJ5LCBhbmQgYSBCb29sZWFuIGluZGljYXRpbmcgdW5pb24gbWVtYmVyc2hpcC4NCmBgYHtyfQ0KbSA8LSBsaXN0KG5hbWU9IlBldGVyIiwgc2FsYXJ5PTMzMDAwLCB1bmlvbj1UKQ0KbQ0KYGBgDQpJbiBvcmRlciB0byBtYWtlIHJlZmVyZW5jZSB0byBhIGNvbXBvbmVudCBvZiB0aGUgbGlzdC4gVXNpbmcgdGhlIG5hbWUgb2YgdGhlIGxpc3QsIGRvbGxhciBzeW1ib2wgKCQpIGFuZCB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgeW91IHdhbnQgdG8ga25vdy4NCg0KYGBge3J9DQptJG5hbWUNCmBgYA0KYGBge3J9DQptJHNhbGFyeQ0KYGBgDQpgYGB7cn0NCm0kdW5pb24NCmBgYA0KDQoNCg0KIyMjIEdlbmVyYWwgTGlzdCBPcGVyYXRpb25zDQoNCiMjIyMgTGlzdCBJbmRleGluZw0KQWJvdmUgaGFzIGJlZW4gc2hvd24gaG93IHRvIGFjY2VzcyB0byBhIGNvbXBvbmVudCBvZiBhIGxpc3QgYnV0IHRoZXJlIG1vcmUgd2F5cyB0byBkbyBpdA0KDQpgYGB7cn0NCm0kbmFtZQ0KYGBgDQoNCg0KDQpgYGB7cn0NCm1bWyJuYW1lIl1dDQpgYGANCml0IGlzIHBvc3NpYmxlIHRvIGFjY2VzcyBjb21wb25lbnQgbmFtZSBvZiB0aGUgbGlzdCB1c2luZyBpdHMgbnVtZXJpY2FsIGluZGV4Lg0KYGBge3J9DQptW1sxXV0NCmBgYA0KbHN0JGMg4oCiIGxzdFtb4oCcY+KAnV1dIOKAoiBsc3RbW2ldXSwgd2hlcmUgaSBpcyB0aGUgaW5kZXggb2YgYyB3aXRoaW4gbHN0DQoNCg0KDQojIyMjIEFkZGluZyBhbmQgRGVsZXRpbmcgTGlzdCBFbGVtZW50cw0KDQpOZXcgY29tcG9uZW50cyBjYW4gYmUgYWRkZWQgYWZ0ZXIgYSBsaXN0IGlzIGNyZWF0ZWQNCmBgYHtyfQ0KbiA8LSBsaXN0KGE9ImhlbGxvIixiPTIzKQ0Kbg0KYGBgDQpTZWxlY3RpbmcgdGhlIHBsYWNlIHRoaXMgbmV3IGNvbXBvbmVudCBpcyBnb2luZyB0byBiZSBhbmQgdGhlIHZhbHVlIGl0IGlzIGdvaW5nIHRvIGhhdmUuDQpgYGB7cn0NCm4kYyA8LSAiYnllIiAjIGFkZCBhIGMgY29tcG9uZW50DQpuDQpgYGANCg0KSXQgaXMgcG9zc2libGUgdG8gYWRkIGNvbXBvbmVudHMgYnkgdGhlIHZlY3RvciBpbmRleC4NCmBgYHtyfQ0KbltbNF1dIDwtIDINCm5bNTo3XSA8LSBjKFRSVUUsVFJVRSxGQUxTRSkNCm4NCmBgYA0KU28gaW4gdGhlIGZvdXJ0aCBjb21wb25lbnQgcG9zaXRpb24gbnVtYmVyIDIgaXMgYWRkZWQgYW5kIGZyb20gcG9zaXRpb24gNSB0byA3IGlzIGdvaW5nIHRvIGJlIFRSVUUsIFRSVUUgYW5kIEZBTFNFIHJlc3BlY3RpdmVseQ0KDQpJbiBvcmRlciB0byBkZWxldGUgYSBsaXN0IGNvbXBvbmVudCwgdmFsdWUgTlVMTCBpcyBhZGRlZCB0byB0aGUgY29tcG9uZW50Lg0KYGBge3J9DQpuJGEgPC0gTlVMTA0Kbg0KYGBgDQpBcyBjb3VsZCBiZSBzZWVuIGluIHRoZSBvdXRwdXQgY29tcG9uZW50ICJhIiBoYXMgYmVlbiBkZWxldGVkLg0KDQoNClIgYWxsb3dzIHlvdSB0byBjb25jYXRlbmF0ZSBsaXN0cyB0b28uDQpgYGB7cn0NCmMobGlzdCgiUGV0ZXIiLCAzMzAwMCwgVCksbGlzdCg1KSkNCmBgYA0Kc28gYSBsaXN0IHdpdGggdGhlIG51bWJlciA1IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBpbml0aWFsIGxpc3QNCg0KDQoNCiMjIyMgR2V0dGluZyB0aGUgU2l6ZSBvZiBhIExpc3QNCg0KU2luY2UgYSBsaXN0IGlzIGEgdmVjdG9yLCB5b3UgY2FuIG9idGFpbiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gYSBsaXN0IHZpYSBsZW5ndGgoKS4NCmBgYHtyfQ0KbGVuZ3RoKG0pDQpgYGANCg0KYGBge3J9DQpsZW5ndGgobikNCmBgYA0KDQoNCg0KIyMjIyBBY2Nlc3NpbmcgTGlzdCBDb21wb25lbnRzIGFuZCBWYWx1ZXMNCg0KVG8gZm91bmQgdGhlIG5hbWVzIG9mIHRoZSBjb21wb25lbnRzLCBmdW5mdGlvbiBuYW1lcygpIGlzIHVzZWQuDQpgYGB7cn0NCm5hbWVzKG0pDQpgYGANCkluIHRoaXMgY2FzZSB0aGUgY29tcG9uZW50cyB3aXRoIHRhZ3MgYXJlIG5hbWUsIHNhbGFyeSBhbmQgdW5pb24uDQoNCkluIG9yZGVyIHRvIGtub3cgdGhlIHZhbHVlcyBvZiBlYWNoIG9mIHRoZXNlIGNvbXBvbmVudHMuDQpgYGB7cn0NCnVsbSA8LSB1bmxpc3QobSkNCnVsbQ0KYGBgDQpUaGUgY2xhc3Mgb2YgdGhlIHVubGlzdCBpcyBjaGFyYWN0ZXIgYmVjYXVzZSBvbmUgb2YgdGhlIHZhbHVlcyBpcyBhIGNoYXJhY3RlciBhbmQganVzdCB3aXRoIG9uZSBvZiB0aGUgdmFsdWVzIGJlaW5nIGEgY2hhcmFjdGVyIGlzIGVub3VnaC4NCmBgYHtyfQ0KY2xhc3ModWxtKQ0KYGBgDQoNCkJ5IHRoZSB3YXkgaWYgYWxsIHRoZSB2YWx1ZXMgYXJlIG51bWJlcnMgdGhlIG91dHB1dCBvZiBjbGFzcyBpcyBnb2luZyB0byBiZSBudW1lcmljDQpgYGB7cn0NCm8gPC0gbGlzdChhPTEzLGI9NTYsYz0zKQ0KcCA8LSB1bmxpc3QobykNCmNsYXNzKHApDQpgYGANCmBgYHtyfQ0KcA0KYGBgDQoNCkhvd2V2ZXIsIGlmIG9uZSBvZiB0aGUgY29tcG9uZW50cyBpcyBhIGNoYXJhY3RlciBhbmQgdGhlIHJlc3QgYXJlIG51bWJlcnMsIHRoZSBjbGFzcyBvZiB0aGUgbGlzdCBpcyBnb2luZyB0byBiZSBDaGFyYWN0ZXINCg0KYGBge3J9DQpxIDwtIGxpc3QoYT0xMyxiPSJoaSIsYz00NSkNCnIgPC0gdW5saXN0KHEpDQpjbGFzcyhyKQ0KDQpgYGANCmBgYHtyfQ0Kcg0KYGBgDQoNCg0KDQojIyMjIEFwcGx5aW5nIEZ1bmN0aW9ucyB0byBMaXN0cw0KVHdvIGZ1bmN0aW9ucyBhcmUgaGFuZHkgZm9yIGFwcGx5aW5nIGZ1bmN0aW9ucyB0byBsaXN0czogbGFwcGx5IGFuZCBzYXBwbHkuDQoNCg0KDQojIyMjIyBVc2luZyB0aGUgbGFwcGx5KCkgYW5kIHNhcHBseSgpIEZ1bmN0aW9ucw0KDQpsYXBwbHkoKSBmdW5jdGlvbm4gd29ya3MgZm9yIGFsbCB2YWx1ZXMgb2YgdGhlIGxpc3QgYW5kIHJldHVybnMgYW5vdGhlciBsaXN0Lg0KDQpgYGB7cn0NCmxhcHBseShsaXN0KDMwOjQ1LDY3OjYyLDczOjgwKSxtZWRpYW4pDQpgYGANCkluIHRoaXMgY2FzZSBtZWRpYW4gaXMgYXBsaWVkIHRvIHZhbHVlcyBiZXR3ZWVuIDMwIHRvIDQ1LCA2NyB0byA2MixhbmQgNzMgdG8gODAuIFRoZW4gYSBsaXN0IHdpdGggdGhlIHZhbHVlcyBvZiB0aGVzZSBtZWRpYW5zIGhhcyBiZWVuIGNyZWF0ZWQuDQoNClNhcHBseSgpIGZ1bmN0aW9uIHJldHVybnMgYSB2ZWN0b3Igb3IgYSBtYXRyaXggaW5zdGVhZCBvZiBhIGxpc3QuDQoNCg0KYGBge3J9DQpzYXBwbHkobGlzdCgzMDo0NSw2Nzo2Miw3Mzo4MCksbWVkaWFuKQ0KYGBgDQoNCg0KDQojIyMgRXh0ZW5kZWQgRXhhbXBsZTogQmFjayB0byB0aGUgQWJhbG9uZSBEYXRhDQoNClVzaW5nIGxhcHBseSgpIGZ1bmN0aW9uIGluIGFuIGV4YW1wbGUgZm9yIGFnZS53ZSB3aXNoZWQgdG8ga25vdyB0aGUgaW5kaWNlcyBvZiB0aGUgb2JzZXJ2YXRpb25zIHRoYXQgd2VyZSBPbGQsIFlvdW5nLCBhbmQgS2lkLg0KYGBge3J9DQphZyA8LSBjKCJPIiwiTyIsIlkiLCJZIiwiSyIsIk8iLCJZIiwiSyIpDQpsYXBwbHkoYygiTyIsIlkiLCJLIiksZnVuY3Rpb24oYWdlKSB3aGljaChhZz09YWdlKSkNCmBgYA0KSW4gdGhhdCBmaXJzdCBjYXNlLCB0aGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB3aGljaChhZz094oCcT+KAnSksIGdpdmluZyB1cyB0aGUgdmVjdG9yIG9mIGluZGljZXMgaW4gYWcgb2YgT2xkLiBBZnRlciBkZXRlcm1pbmluZyB0aGUgaW5kaWNlcyBmb3IgdGhlIFlvdW5nIGFuZCBLaWRzLCBsYXBwbHkoKSB3aWxsIHJldHVybiB0aGUgdGhyZWUgdmVjdG9ycyBpbiBhIGxpc3QuDQoNCg0KDQojIyMjI1JlY3Vyc2l2ZSBMaXN0cyANCkxpc3RzIGNhbiBiZSByZWN1cnNpdmUsIG1lYW5pbmcgdGhhdCB5b3UgY2FuIGhhdmUgbGlzdHMgd2l0aGluIGxpc3RzLg0KDQpgYGB7cn0NCmIgPC0gbGlzdChrID0gMTMsIHYgPSA5OSwgeiA9IDMyKQ0KYyA8LSBsaXN0KHkgPSA0NSwgaCA9IDc3KQ0KYSA8LSBsaXN0KGIsYykNCmBgYA0KDQpgYGB7cn0NCmENCmBgYA0KU2luY2UgYSBpcyBjb21wb3NlZCBvZiAyIGxpc3RzIGl0cyBsZW5ndGggaXMgMi4NCmBgYHtyfQ0KbGVuZ3RoKGEpDQpgYGANCg0KVGhpcyBjb2RlIG1ha2VzIGEgaW50byBhIHR3by1jb21wb25lbnQgbGlzdCwgd2l0aCBlYWNoIGNvbXBvbmVudCBpdHNlbGYgYWxzbyBiZWluZyBhIGxpc3QuIFRoZSBjb25jYXRlbmF0ZSBmdW5jdGlvbiBjKCkgaGFzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHJlY3Vyc2l2ZSwgd2hpY2ggY29udHJvbHMgd2hldGhlciBmbGF0dGVuaW5nIG9jY3VycyB3aGVuIHJlY3Vyc2l2ZSBsaXN0cyBhcmUgY29tYmluZWQNCg0KYGBge3J9DQpjKGxpc3QoYT0zNCxiPTIyLGM9bGlzdChkPTMsZT0xMSkpKQ0KYGBgDQpJbiB0aGUgYWJvdmUgY2FzZSwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgcmVjdXJzaXZlIGhhcyBiZWVuIGFjY2VwdGVkLCB3aGljaCBpcyBGQUxTRSwgYW5kIG9idGFpbmVkIGEgcmVjdXJzaXZlIGxpc3QsIHdpdGggdGhlIGMgY29tcG9uZW50IG9mIHRoZSBtYWluIGxpc3QgaXRzZWxmIGJlaW5nIGFub3RoZXIgbGlzdA0KDQpgYGB7cn0NCmMobGlzdChhPTEsYj0yLGM9bGlzdChkPTUsZT05KSkscmVjdXJzaXZlPVQpDQpgYGANCg0KTm93LCB3cml0aW5nIHJlY3Vyc2l2ZSA9IFRSVUUsIHdlIGdvdCBhIHNpbmdsZSBsaXN0IGFzIGEgcmVzdWx0Lg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=