Difference between revisions of "RPR-OBJECTS-Lists"

From "A B C"
Jump to navigation Jump to search
m
m
Line 28: Line 28:
 
== Abstract ==
 
== Abstract ==
 
<section begin=abstract />
 
<section begin=abstract />
<!-- included from "../components/RPR-Objects-Lists.components.wtxt", section: "abstract" -->
+
<!-- included from "./components/RPR-Objects-Lists.components.txt", section: "abstract" -->
 
Introduction to R list data types: properties, how to create, and modify them and how to retrieve data.
 
Introduction to R list data types: properties, how to create, and modify them and how to retrieve data.
 
<section end=abstract />
 
<section end=abstract />
Line 37: Line 37:
 
== This unit ... ==
 
== This unit ... ==
 
=== Prerequisites ===
 
=== Prerequisites ===
<!-- included from "../components/RPR-Objects-Lists.components.wtxt", section: "prerequisites" -->
+
<!-- included from "./components/RPR-Objects-Lists.components.txt", section: "prerequisites" -->
<!-- included from "ABC-unit_components.wtxt", section: "notes-prerequisites" -->
+
<!-- included from "./data/ABC-unit_components.txt", section: "notes-prerequisites" -->
 
You need to complete the following units before beginning this one:
 
You need to complete the following units before beginning this one:
 
*[[RPR-Objects-Data_frames|RPR-Objects-Data_frames (R "data frames"")]]
 
*[[RPR-Objects-Data_frames|RPR-Objects-Data_frames (R "data frames"")]]
Line 46: Line 46:
  
 
=== Objectives ===
 
=== Objectives ===
<!-- included from "../components/RPR-Objects-Lists.components.wtxt", section: "objectives" -->
+
<!-- included from "./components/RPR-Objects-Lists.components.txt", section: "objectives" -->
 
This unit will ...
 
This unit will ...
 
* ... introduce R lists;
 
* ... introduce R lists;
Line 55: Line 55:
  
 
=== Outcomes ===
 
=== Outcomes ===
<!-- included from "../components/RPR-Objects-Lists.components.wtxt", section: "outcomes" -->
+
<!-- included from "./components/RPR-Objects-Lists.components.txt", section: "outcomes" -->
 
After working through this unit you ...
 
After working through this unit you ...
 
* ... know how to create and manipulate lists;
 
* ... know how to create and manipulate lists;
Line 64: Line 64:
  
 
=== Deliverables ===
 
=== Deliverables ===
<!-- included from "../components/RPR-Objects-Lists.components.wtxt", section: "deliverables" -->
+
<!-- included from "./components/RPR-Objects-Lists.components.txt", section: "deliverables" -->
<!-- included from "ABC-unit_components.wtxt", section: "deliverables-time_management" -->
+
<!-- included from "./data/ABC-unit_components.txt", section: "deliverables-time_management" -->
 
*<b>Time management</b>: Before you begin, estimate how long it will take you to complete this unit. Then, record in your course journal: the number of hours you estimated, the number of hours you worked on the unit, and the amount of time that passed between start and completion of this unit.
 
*<b>Time management</b>: Before you begin, estimate how long it will take you to complete this unit. Then, record in your course journal: the number of hours you estimated, the number of hours you worked on the unit, and the amount of time that passed between start and completion of this unit.
<!-- included from "ABC-unit_components.wtxt", section: "deliverables-journal" -->
+
<!-- included from "./data/ABC-unit_components.txt", section: "deliverables-journal" -->
 
*<b>Journal</b>: Document your progress in your [[FND-Journal|Course Journal]]. Some tasks may ask you to include specific items in your journal. Don't overlook these.
 
*<b>Journal</b>: Document your progress in your [[FND-Journal|Course Journal]]. Some tasks may ask you to include specific items in your journal. Don't overlook these.
<!-- included from "ABC-unit_components.wtxt", section: "deliverables-insights" -->
+
<!-- included from "./data/ABC-unit_components.txt", section: "deliverables-insights" -->
 
*<b>Insights</b>: If you find something particularly noteworthy about this unit, make a note in your [[ABC-Insights|'''insights!''' page]].
 
*<b>Insights</b>: If you find something particularly noteworthy about this unit, make a note in your [[ABC-Insights|'''insights!''' page]].
 
{{Vspace}}
 
 
 
=== Evaluation ===
 
<!-- included from "../components/RPR-Objects-Lists.components.wtxt", section: "evaluation" -->
 
<!-- included from "ABC-unit_components.wtxt", section: "eval-none" -->
 
<b>Evaluation: NA</b><br />
 
:This unit is not evaluated for course marks.
 
  
 
{{Vspace}}
 
{{Vspace}}
Line 87: Line 78:
 
<div id="BIO">
 
<div id="BIO">
 
== Contents ==
 
== Contents ==
<!-- included from "../components/RPR-Objects-Lists.components.wtxt", section: "contents" -->
+
<!-- included from "./components/RPR-Objects-Lists.components.txt", section: "contents" -->
  
 
{{task| 1=
 
{{task| 1=
Line 195: Line 186:
  
 
== Notes ==
 
== Notes ==
<!-- included from "../components/RPR-Objects-Lists.components.wtxt", section: "notes" -->
+
<!-- included from "./components/RPR-Objects-Lists.components.txt", section: "notes" -->
<!-- included from "ABC-unit_components.wtxt", section: "notes" -->
+
<!-- included from "./data/ABC-unit_components.txt", section: "notes" -->
 
<references />
 
<references />
  
Line 205: Line 196:
 
<div id="ABC-unit-framework">
 
<div id="ABC-unit-framework">
 
== Self-evaluation ==
 
== Self-evaluation ==
<!-- included from "../components/RPR-Objects-Lists.components.wtxt", section: "self-evaluation" -->
+
<!-- included from "./components/RPR-Objects-Lists.components.txt", section: "self-evaluation" -->
  
 
=== Question 1===
 
=== Question 1===
Line 234: Line 225:
  
  
<!-- included from "ABC-unit_components.wtxt", section: "ABC-unit_ask" -->
+
<!-- included from "./data/ABC-unit_components.txt", section: "ABC-unit_ask" -->
  
 
----
 
----
Line 263: Line 254:
 
</div>
 
</div>
 
[[Category:ABC-units]]
 
[[Category:ABC-units]]
<!-- included from "ABC-unit_components.wtxt", section: "ABC-unit_footer" -->
+
<!-- included from "./data/ABC-unit_components.txt", section: "ABC-unit_footer" -->
  
 
{{CC-BY}}
 
{{CC-BY}}

Revision as of 01:27, 6 January 2018

Abstract

Introduction to R list data types: properties, how to create, and modify them and how to retrieve data.


 


This unit ...

Prerequisites

You need to complete the following units before beginning this one:


 


Objectives

This unit will ...

  • ... introduce R lists;
  • ... cover a number of basic operations.


 


Outcomes

After working through this unit you ...

  • ... know how to create and manipulate lists;
  • ... can extract items from lists.


 


Deliverables

  • Time management: Before you begin, estimate how long it will take you to complete this unit. Then, record in your course journal: the number of hours you estimated, the number of hours you worked on the unit, and the amount of time that passed between start and completion of this unit.
  • Journal: Document your progress in your Course Journal. Some tasks may ask you to include specific items in your journal. Don't overlook these.
  • Insights: If you find something particularly noteworthy about this unit, make a note in your insights! page.


 


Contents

Task:

  • Load the R-Exercise_BasicSetup project in RStudio if you don't already have it open.
  • Type init() as instructed after the project has loaded.
  • Continue below.


 

Lists

The elements of matrices and arrays all have to be of the same type. Data frames allow us to store elements of different types in columns, but all columns have to have the same length and the elements have to be "atomic" - i.e. you can't put vectors into dataframe columns. But R's lists are much more versatile. They are simply ordered collections of components. These components can have different type - all kinds of R objects can go into a list: characters, booleans, any kind of numeric data, even functions - AND they can have different size.

Lists are created with the list() function, which works similar to the c() function for vectors. Components are accessed through their index in double square brackets, or through their name, using the "$" operator, if the name has been defined. Here is an example:

pUC19 <- list(size=2686, marker="ampicillin", ori="ColE1", accession="L01397", BanI=c(235, 408, 550, 1647) )

objectInfo(pUC19)
pUC19[[1]]
pUC19[[2]]
pUC19$ori
pUC19$BanI[2]

Note that in we stored multiple restriction enzymes in one string, separated by commas, in our data frame example. While we can take such strings apart again, by using the strsplit() function, the string itself still has to be one single element in the data frame's column. Lists have no such restriction. In our example above, we assigned a vector of restriction site positions to the element "BanI".

You can easily imagine that we could now create a list of lists, and that list of lists could hold an entire plasmid database in a most versatile way. Let's do this!


Task:

  • Create a list like with data for pACYC184 following the structure for the pUC19 example but using only size, marker and ori data:
size: 4245
marker: Tet, Cam
ori: p15A
  • Confirm that your new list's structure looks the pUC19 one (minus "accession", and the "BanI"" element).
  • Make a new list, call it plasmidDB and assign to it the puc19 list:
plasmidDB <- list()
plasmidDB[["pUC19"]] <- pUC19
  • Add your pACYC184 list
  • Add a third element to plasmidDB, "pBR322" using the pBR322 data:
size: 4361
marker: Amp, Tet
ori: ColE1


Then:

  • retrieve the entire pACYC184 list

Whereas data frames allow you to get all data from a column directly, this is not possible for lists. You need a function that iterates over all list elements instead. Such a function is lapply(), one of several "apply" functions. For example, to get all "ori" elements, try:

lapply(plasmidDB, function(x) { return(x$ori) })
  • Retrieve all sizes from the list. Use unlist() to flatten the result. Then use min() to find the size of the smallest one.

Lost? Solutions here (but don't peek).

pUC19 <- list(size=2686, marker="ampicillin", ori="ColE1", accession="L01397", BanI=c(235, 408, 550, 1647) )
pACYC184 <- list(size=4245, marker="Tet, Cam", ori="p15A" )

plasmidDB <- list()
plasmidDB[["pUC19"]] <- pUC19
plasmidDB[["pACYC184"]] <- pACYC184
plasmidDB[["pBR322"]] <- list(size=4361, marker="Amp, Tet", ori="ColE1" )

plasmidDB[["pACYC184"]] # retrieve the entire pACYC184 list

lapply(plasmidDB, function(x) { return(x$ori) })
x <- unlist(lapply(plasmidDB, function(x) { return(x$size) }))
min(x)
# or, to get the name too ...
x[x == min(x)]



 


 


Further reading, links and resources

 


Notes


 


Self-evaluation

Question 1

Execute: x <- strsplit(plasmidData$Sites, ", ") and analyze the result.

  • (A) What is plasmidData$Sites?
  • (B) What is x?
  • (C) Why does strsplit() have a list as return value, not a vector or a data frame?

Answer ...

  • (A) A vector of strings (character elements).
  • (B) A list of vectors.
  • (C) Because strsplit() is vectorized and operates on all elements of the vector plasmidData$Sites. But the function doesn't know in advance how many elements the result is going to have for each element. So it needs to output vectors of different lengths. And the only way to combine them into a single value (note: all R functions return only a single value) is by collecting them in a list.


 


 



 




 

If in doubt, ask! If anything about this learning unit is not clear to you, do not proceed blindly but ask for clarification. Post your question on the course mailing list: others are likely to have similar problems. Or send an email to your instructor.



 

About ...
 
Author:

Boris Steipe <boris.steipe@utoronto.ca>

Created:

2017-08-05

Modified:

2017-09-24

Version:

1.0.1

Version history:

  • 1.0.1 Fixed error in list example
  • 1.0 Completed to first live version
  • 0.1 Material collected from previous tutorial

CreativeCommonsBy.png This copyrighted material is licensed under a Creative Commons Attribution 4.0 International License. Follow the link to learn more.