Examples to use if else, anf for in R

by SA Maghsoudi & Z Zamaninasab

IF ELSE: quadratic equation

a=1
b=8
c=5
delta=b^2-4*a*c
if(delta>0){
roots=c((-b+sqrt(delta))/(2*a),
       (-b-sqrt(delta))/(2*a))
}else{
    if(delta==0){
 roots=-b/(2*a)
   }else{
 roots=c("Has no real roots")
  }
 }
print(roots)
## [1] -0.6833752 -7.3166248

FOR: calculate difference between any two consecutive values

x=rnorm(1000)
y=numeric(1000) # or y=rep(NA,1000)
for(i in 2:1000){
y[i]=x[i]-x[i-1]
}
cor(x,y,method="pearson")
## [1] 0.6928525
plot(y)

FOR: multiplication table

m=matrix(NA,10,10)
for(i in 1:10){
for(j in 1:10){
 m[i,j]=i*j
}
}
m
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    1    2    3    4    5    6    7    8    9    10
##  [2,]    2    4    6    8   10   12   14   16   18    20
##  [3,]    3    6    9   12   15   18   21   24   27    30
##  [4,]    4    8   12   16   20   24   28   32   36    40
##  [5,]    5   10   15   20   25   30   35   40   45    50
##  [6,]    6   12   18   24   30   36   42   48   54    60
##  [7,]    7   14   21   28   35   42   49   56   63    70
##  [8,]    8   16   24   32   40   48   56   64   72    80
##  [9,]    9   18   27   36   45   54   63   72   81    90
## [10,]   10   20   30   40   50   60   70   80   90   100

WHILE: print i^2 for i<10

i=1
while(i<10){
print(i^2)
i=i+1
}
## [1] 1
## [1] 4
## [1] 9
## [1] 16
## [1] 25
## [1] 36
## [1] 49
## [1] 64
## [1] 81
i=1
while(i<5){
print(i/2)
if(i==3){
print("three")
}
i=i+1
}
## [1] 0.5
## [1] 1
## [1] 1.5
## [1] "three"
## [1] 2

longitudinal data: impute with subject-specific regression

id=rep(1:3,each=5)
time=rep(1:5,3)
bmi=c(19.7,20.2,20.4,NA,21.1,19.1,19.8,22.3,NA,23.4,NA,20.8,20.9,NA,22.8)
data=data.frame(id,time,bmi)

imp.bmi<- c()
for( i in 1:3){
   d1<- subset(data,id==i)
   f<- lm(bmi~time,data=d1)
  pred.f<- f$coefficients[1]+f$coefficients[2]*d1$time
  imp.bmi<- c(imp.bmi,ifelse (is.na(d1$bmi)==TRUE,pred.f,d1$bmi))
  }
data.imp<- cbind(data,imp.bmi=imp.bmi)
head(data.imp)
##   id time  bmi  imp.bmi
## 1  1    1 19.7 19.70000
## 2  1    2 20.2 20.20000
## 3  1    3 20.4 20.40000
## 4  1    4   NA 20.77143
## 5  1    5 21.1 21.10000
## 6  2    1 19.1 19.10000

longitudinal data: for each case show row with maximum bmi

id=rep(1:3,each=5)
time=rep(1:5,3)
bmi=c(19.7,20.2,20.4,NA,21.1,19.1,19.8,22.3,NA,23.4,NA,20.8,20.9,NA,22.8)
data=data.frame(id,time,bmi)
mydata=c()
for (i in 1:3){
  d1=subset(data,id==i)
  if(any(is.na(d1$bmi)==FALSE)){
mydata=rbind(mydata,subset(d1,time==which.max(d1$bmi)))
 }
}
mydata
##    id time  bmi
## 5   1    5 21.1
## 10  2    5 23.4
## 15  3    5 22.8

longitudinal data: lag function

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
id=rep(1:3,each=5)
time=rep(1:5,3)
bmi=c(19.7,20.2,20.4,25,21.1,19.1,19.8,22.3,25,23.4,25,20.8,20.9,25,22.8)
data=data.frame(id,time,bmi)
data <- 
  data %>%
  group_by(id) %>%
  mutate(lagbmi=dplyr::lag(bmi, n = 1, default = NA))
data
## # A tibble: 15 x 4
## # Groups:   id [3]
##       id  time   bmi lagbmi
##    <int> <int> <dbl>  <dbl>
##  1     1     1  19.7   NA  
##  2     1     2  20.2   19.7
##  3     1     3  20.4   20.2
##  4     1     4  25     20.4
##  5     1     5  21.1   25  
##  6     2     1  19.1   NA  
##  7     2     2  19.8   19.1
##  8     2     3  22.3   19.8
##  9     2     4  25     22.3
## 10     2     5  23.4   25  
## 11     3     1  25     NA  
## 12     3     2  20.8   25  
## 13     3     3  20.9   20.8
## 14     3     4  25     20.9
## 15     3     5  22.8   25

longitudinal data: another approach for lag function

id=rep(1:3,each=5)
time=rep(1:5,3)
bmi=c(19.7,20.2,20.4,25,21.1,19.1,19.8,22.3,25,23.4,25,20.8,20.9,25,22.8)
data=data.frame(id,time,bmi)
lagbmi=c()
lagbmi0=c()
for(i in 1:3){
d1<- subset(data,id==i)
 lagbmi= c(lagbmi,c(NA,d1$bmi[-1]))
}
data=data.frame(data,lagbmi)
data
##    id time  bmi lagbmi
## 1   1    1 19.7     NA
## 2   1    2 20.2   20.2
## 3   1    3 20.4   20.4
## 4   1    4 25.0   25.0
## 5   1    5 21.1   21.1
## 6   2    1 19.1     NA
## 7   2    2 19.8   19.8
## 8   2    3 22.3   22.3
## 9   2    4 25.0   25.0
## 10  2    5 23.4   23.4
## 11  3    1 25.0     NA
## 12  3    2 20.8   20.8
## 13  3    3 20.9   20.9
## 14  3    4 25.0   25.0
## 15  3    5 22.8   22.8