# Mark Needham

Thoughts on Software Development

## R: Mapping over a list of lists

with one comment

```> file <- "https://dl.dropbox.com/u/7710864/data/csv_hid/ss06hid.csv" > download.file(file, destfile="americancommunity.csv", method="curl") > acomm <- read.csv("americancommunity.csv")```

We then had to filter the data based on the values in a couple of columns and work out how many rows were returned in each case:

```> one <- acomm[acomm\$RMS == 4 & !is.na(acomm\$RMS) & acomm\$BDS == 3 & !is.na(acomm\$BDS), c("RMS")] > one [1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ... [137] 4 4 4 4 4 4 4 4 4 4 4 4 > two <- acomm[acomm\$RMS == 5 & !is.na(acomm\$RMS) & acomm\$BDS == 2 & !is.na(acomm\$BDS), c("RMS")] > two [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ... [375] 5 5 5 5 5 5 5 5 5 5 5 5   > three <- acomm[acomm\$RMS == 7 & !is.na(acomm\$RMS) & acomm\$BDS == 2 & !is.na(acomm\$BDS), c("RMS")] > three [1] 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 [36] 7 7 7 7 7 7 7 7 7 7 7 7 7 7```

So I needed to know how many values were in the variables one, two and three.

I thought I could probably put those lists into another list and then use apply or one of its variants to get the length of each one.

I usually use the c function to help me create lists but it’s not helpful in this case as it creates one massive vector with all the values concatenated together:

Calling apply doesn’t have the intended outcome:

```> lapply(c(one, two, three), length) ... [[582]] [1] 1   [[583]] [1] 1```

Instead what we need is the list function:

```> lapply(list(one, two, three), length) [[1]] [1] 148   [[2]] [1] 386   [[3]] [1] 49```

Et voila!

The code is on github as usual.

Be Sociable, Share!

Written by Mark Needham

February 3rd, 2013 at 10:40 am

Posted in R

Tagged with