Along with data frames, a list is one of the most useful and most-encountered objects in R.

They are the only object in R that can store different modes of data objects of *different sizes*.

As such, they are the usual output from statistical tests and models, becuase these outputs include single values (e.g., a text statistic or p-value), as well as vectors of confidence limits, and matrices or data frames of input data.

A list is technically a 1-dimensional object.

Lists are akin to a a closet (*wardrobe*), where you can hang multiple different hangers off a single main bar (hence the 1d).

Lists are constructed with `list()`

(cf. `c()`

for atomic vectors).

Notice that, similar to data frames, we can name each component (‘hanger’) of the list. (For a data frame, we can use a similar construction to name the columns, if we generate the data frame within R).

```
l <- list(a = 1:4,
b = c('i', 'i', 'ii', 'ii'),
c = c(1.1, 2.2, 3.3, 4.4)
)
l
```

```
$a
[1] 1 2 3 4
$b
[1] "i" "i" "ii" "ii"
$c
[1] 1.1 2.2 3.3 4.4
```

Here, we have a list of three components, a, b, and c.

Using `str()`

to look at the structure, we can see that we have a list of 3 components: an integer, a character, and a numeric vector.
As usual, we get information on each component, its mode, length, and the first few elements.

```
str(l)
```

```
List of 3
$ a: int [1:4] 1 2 3 4
$ b: chr [1:4] "i" "i" "ii" "ii"
$ c: num [1:4] 1.1 2.2 3.3 4.4
```

Lists can contain much more than just vectors.

```
l <- list(a = 1:5, b = list(b1 = 1, b2 = c('one', 'two')), c = data.frame(x = 1:4, y = 5:8, z = 9:12))
l
```

```
$a
[1] 1 2 3 4 5
$b
$b$b1
[1] 1
$b$b2
[1] "one" "two"
$c
x y z
1 1 5 9
2 2 6 10
3 3 7 11
4 4 8 12
```

```
str(l)
```

```
List of 3
$ a: int [1:5] 1 2 3 4 5
$ b:List of 2
..$ b1: num 1
..$ b2: chr [1:2] "one" "two"
$ c:'data.frame': 4 obs. of 3 variables:
..$ x: int [1:4] 1 2 3 4
..$ y: int [1:4] 5 6 7 8
..$ z: int [1:4] 9 10 11 12
```

As described in Subsetting and Indexing, we can access various parts of the list using `[`

, `[[`

, and `$`

.
We can access each main component by name (with `$`

or `[`

), or by number (with `[`

).

```
l$b
```

```
$b1
[1] 1
$b2
[1] "one" "two"
```

Similarly, we can access the sub-lists.

```
l$b$b2
```

```
[1] "one" "two"
```

And we can directly access the elements using `[[`

and `$`

.

```
l$b[['b2']]
```

```
[1] "one" "two"
```

We can use these same tools to access the outputs of statistical models, etc.

For example, the output of a t-test includes the estimates of each mean, t, and p values.

```
m <- t.test(l$c$x, l$c$y)
m
```

```
Welch Two Sample t-test
data: l$c$x and l$c$y
t = -4.3818, df = 6, p-value = 0.004659
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-6.233715 -1.766285
sample estimates:
mean of x mean of y
2.5 6.5
```

Let’s look at the structure of this list.

```
str(m)
```

```
List of 9
$ statistic : Named num -4.38
..- attr(*, "names")= chr "t"
$ parameter : Named num 6
..- attr(*, "names")= chr "df"
$ p.value : num 0.00466
$ conf.int : atomic [1:2] -6.23 -1.77
..- attr(*, "conf.level")= num 0.95
$ estimate : Named num [1:2] 2.5 6.5
..- attr(*, "names")= chr [1:2] "mean of x" "mean of y"
$ null.value : Named num 0
..- attr(*, "names")= chr "difference in means"
$ alternative: chr "two.sided"
$ method : chr "Welch Two Sample t-test"
$ data.name : chr "l$c$x and l$c$y"
- attr(*, "class")= chr "htest"
```

We can extract and display any part of this output.

```
m$p.value
```

```
[1] 0.004659215
```

We can pass these extracted elements to new objects, which might be tables, figures, …

More details in Hadley Wickham’s Advanced R