19.1 Exercise 12: For loop
Create the script “exercise10.R” and save it to the “Rcourse/ExtraModule” directory: you will save all the commands of exercise 10 in that script.
Remember you can comment the code using #.
Answer
getwd()
setwd("~/Rcourse/ExtraModule")1- Write a for loop that iterates over the sequence of numbers 2 to 10 (both included), and prints the square root of each number (function sqrt()).
Answer
for(i in 2:10){
print(sqrt(i))
}2- Write a for loop that iterates over the sequence of numbers 5 to 15 (both included), and prints a new vector of 2 elements containing the number and its square root
Answer
for(i in 5:15){
veci <- c(i, sqrt(i))
print(veci)
}3- Create the following matrix
mat1 <- matrix(rnorm(40), nrow=20)- Write a for loop that iterates over each row of mat1 and prints the median value of each row.
Answer
for(j in 1:nrow(mat1)){
# extract the row
rowj <- mat1[j,]
# compute the median
medrowj <- median(rowj)
# print median value in row
print(medrowj)
}
# with less lines of code:
for(j in 1:nrow(mat1)){
# print median value in row
print(median(mat1[j,]))
} 2- If statement in for loop
Create the following matrix:
mat4 <- matrix(c(2, 34, 1, NA, 89, 7, 12, NA, 0, 38),
nrow=5)Write a for loop that iterates over each row of mat4: if an NA is found, print the row number and the entire row where the NA is found.
Answer
for(k in 1:nrow(mat4)){
# extract row
rowk <- mat4[k,]
if(any(is.na(rowk))){
print(k)
print(rowk)
}
}3- For loop, if statement and regular expression
Create vector vec4 as:
vec4 <- c("Oct4", "DEPP", "RSU1", "Hk2", "ZNF37A", "C1QL1", "Shh", "Cdkn2a")vec4 contains Human and Mouse gene symbols.
Loop over each element of vec4:
- If the element is a human gene (both characters and numbers; all characters are written in upper-case), print a vector of two elements: the name of the gene and “human gene.”
- If the element is a mouse gene (both characters and numbers; only the first character is written in upper-case), print a vector of two elements: the name of the gene and “mouse gene.”
Tip 1: Use grep and a regular expression in the if statement !
Tip 2: When grep does not find a match, it returns an element of length 0 !
Tip 3: You can also use grepl: check the help page
How do you get started?
- First, work on the regular expressions: how do you retrieve Human genes only? How do you retrieve Mouse genes only?
- Then, integrate the regular expressions in the if statement.
- Finally, integrate all this in a for loop!
Answer
for(gene in vec4){
if(length(grep(pattern="^[A-Z0-9]+$", x=gene)) != 0){
print(c(gene, "human gene"))
}else if(length(grep(pattern="^[A-Z]{1}[a-z0-9]+$", x=gene)) != 0){
print(c(gene, "mouse gene"))
}
}
# With grepl
# grepl returns a logical vector (match or not for each element of x), not the matching elements themselves.
for(gene in vec4){
if(grepl(pattern="^[A-Z0-9]+$", x=gene)){
print(c(gene, "human gene"))
}else if(grepl(pattern="^[A-Z]{1}[a-z0-9]+$", x=gene)){
print(c(gene, "mouse gene"))
}
}
# easier way! whenever a lower case character is present: it is from mouse
for(gene in vec4){
if(length(grep(pattern="[[:lower:]]", x=gene)) != 0){
print(c(gene, "mouse gene"))
}else{
print(c(gene, "human gene"))
}
}