R is a very flexible and powerful programming language, as well as a package that is written
using that language (and others like C). The following program demonstrates many of its basic
features. You can cut and paste it into R, or download the file that includes it from here. If you
run it line by line, many of its features will become clear. Both editions of R for SAS and SPSS
Users and R for Stata Users work through a version of this program line-by-line, showing the
output and explaining what R is doing.
# Filename: ProgrammingBasics.R
# ---Simple Calculations---
2 + 3
x <- 2
y <- 3
x + y
x * y
# ---Data Structures---
# Vectors
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
print(workshop)
workshop
gender <- c("f", "f", "f", NA, "m", "m", "m", "m")
q1 <- c(1, 2, 2, 3, 4, 5, 5, 4)
q2 <- c(1, 1, 2, 1, 5, 4, 3, 5)
q3 <- c(5, 4, 4,NA, 2, 5, 4, 5)
q4 <- c(1, 1, 3, 3, 4, 5, 4, 5)
# Selecting Elements of Vectors
q1[5]
q1[ c(5, 6, 7, 8) ]
q1[5:8]
q1[gender == "m"]
mean( q1[ gender == "m" ], na.rm = TRUE)
# ---Factors---
# Numeric Factors
# First, as a vector
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
workshop
table(workshop)
mean(workshop)
gender[workshop == 2]
# Now as a factor
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
workshop <- factor(workshop)
workshop
table(workshop)
mean(workshop) #generates error now.
gender[workshop == 2]
gender[workshop == "2"]
# Recreate workshop, making it a factor
# including levels that don't yet exist.
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
workshop <- factor(
workshop,
levels = c( 1, 2, 3, 4),
labels = c("R", "SAS", "SPSS", "Stata")
)
# Recreate it with just the levels it
# curently has.
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
workshop <- factor(
workshop,
levels = c( 1, 2),
labels = c("R","SAS")
)
workshop
table(workshop)
gender[workshop == 2]
gender[workshop == "2"]
gender[workshop == "SAS"]
# Character factors
gender <- c("f", "f", "f", NA, "m", "m", "m", "m")
gender <- factor(
gender,
levels = c("m", "f"),
labels = c("Male", "Female")
)
gender
table(gender)
workshop[gender == "m"]
workshop[gender == "Male"]
# Recreate gender and make it a factor,
# keeping simpler m and f as labels.
gender <- c("f", "f", "f", NA, "m", "m", "m", "m")
gender <- factor(gender)
gender
# Data Frames
mydata <- data.frame(workshop, gender, q1, q2, q3, q4)
mydata
names(mydata)
row.names(mydata)
# Selecting components by index number
mydata[8, 6] #8th obs, 6th var
mydata[ , 6] #All obs, 6th var
mydata[ , 6][5:8] #6th var, obs 5:8
# Selecting components by name
mydata$q1
mydata$q1[5:8]
# Example renaming gender to sex while
# creating a data frame (left as a comment)
#
# mydata <- data.frame(workshop, sex = gender,
# q1, q2, q3, q4)
# Matrices
# Creating from vectors
mymatrix <- cbind(q1, q2, q3, q4)
mymatrix
dim(mymatrix)
# Creating from matrix function
# left as a comment so we keep
# version with names q1, q2...
#
# mymatrix <- matrix(
# c(1, 1, 5, 1,
# 2, 1, 4, 1,
# 2, 2, 4, 3,
# 3, 1, NA,3,
# 4, 5, 2, 4,
# 5, 4, 5, 5,
# 5, 3, 4, 4,
# 4, 5, 5, 5),
# nrow = 8, ncol = 4, byrow = TRUE)
# mymatrix
table(mymatrix)
mean(mymatrix, na.rm = TRUE)
cor(mymatrix, use = "pairwise")
# Selecting Subsets of Matrices
mymatrix[8, 4]
mymatrix[5:8, 3:4]
mymatrix[ ,4][1:4]
mymatrix$q4 # No good!
mymatrix[ ,"q4"]
# Matrix Algebra
mymatrixT <- t(mymatrix)
mymatrixT
# Lists
mylist <- list(workshop, gender,
q1, q2, q3, q4, mymatrix)
mylist
# List, this time adding names
mylist <- list(
workshop = workshop,
gender = gender,
q1 = q1,
q2 = q2,
q3 = q3,
q4 = q4,
mymatrix = mymatrix)
mylist
# Selecting components by index number.
mylist[[2]]
mylist[[2]][5:8]
mylist[2]
mylist[2][5:8] # Bad!
# Selecting components by name.
mylist$q1
mylist$mymatrix[5:8, 3:4]
# ---Saving Your Work---
ls()
objects() #same as ls()
save.image("myall.RData")
save(mydata, file = "mydata.RData")
# The 2nd approach is commented to keep
# the q variables for following examples.
# rm(x, y, workshop, gender, q1, q2, q3, q4, mylist)
# ls()
# save.image(file = "mydata.RData")
# ---Comments to Document Your Programs---
# This comment is on its own line, between functions.
workshop <- c(1, 2, 1, 2, #This comment is within the arguments.
1, 2, 1, 2) # And this is at the end.
# ---Comments to Document Your Objects---
comment(mydata) <- "Example data from R for SAS and SPSS Users"
comment(mydata)
# ---Controlling Functions---
# Controlling Functions with Arguments
help("mean")
mean(x = q3, trim = .25, na.rm = TRUE)
mean(na.rm = TRUE, x = q3, trim = .25)
mean(q3, .25, TRUE)
mean(q3, t = .25, na.rm = TRUE)
mean(1, 2, 3)
mean( c(1, 2, 3) )
mean( 1:3 )
# Controlling Functions With Formulas
lm( q4 ~ q1 + q2 + q3, data = mydata )
t.test(q1 ~ gender, data = mydata)
t.test( q1[ which(gender == "Female") ],
q1[ which(gender == "Male") ],
data = mydata) # Data ignored!
# Controlling Functions with Extractor Functions
lm( q4 ~ q1 + q2 + q3, data = mydata )
myModel <- lm( q4 ~ q1 + q2 + q3, data = mydata )
class(myModel)
summary(myModel)
# How Much Output Is There?
print(mymodel)
mode(myModel)
class(myModel)
names(myModel)
print( unclass(myModel) )
myModel$coefficients
class( myModel$coefficients )
barplot( myModel$coefficients )
# ---Writing Your Own Functions (Macros)---
myvar <- c(1, 2, 3, 4, 5)
# A bad function.
mystats <- function(x) {
mean(x, na.rm = TRUE)
sd(x, na.rm = TRUE)
}
mystats(myvar)
# A good function that just prints.
mystats <- function(x) {
print( mean(x, na.rm = TRUE) )
print( sd(x, na.rm = TRUE) )
}
mystats(myvar)
# A function with vector output.
mystats <- function(x) {
mymean <- mean(x, na.rm = TRUE)
mysd <- sd(x, na.rm = TRUE)
c(mean = mymean, sd = mysd )
}
mystats(myvar)
myVector <- mystats(myvar)
myVector
# A function with list output.
mystats <- function(x) {
myinput <- x
mymean <- mean(x, na.rm = TRUE)
mysd <- sd(x, na.rm = TRUE)
list(data = myinput, mean = mymean, sd = mysd)
}
mystats(myvar)
myStatlist <- mystats(myvar)
myStatlist
mystats
save(mydata, mymatrix, mylist, mystats,
file = "myWorkspace.RData")
Solution
R is a very flexible and powerful programming language, as well as a package that is written
using that language (and others like C). The following program demonstrates many of its basic
features. You can cut and paste it into R, or download the file that includes it from here. If you
run it line by line, many of its features will become clear. Both editions of R for SAS and SPSS
Users and R for Stata Users work through a version of this program line-by-line, showing the
output and explaining what R is doing.
# Filename: ProgrammingBasics.R
# ---Simple Calculations---
2 + 3
x <- 2
y <- 3
x + y
x * y
# ---Data Structures---
# Vectors
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
print(workshop)
workshop
gender <- c("f", "f", "f", NA, "m", "m", "m", "m")
q1 <- c(1, 2, 2, 3, 4, 5, 5, 4)
q2 <- c(1, 1, 2, 1, 5, 4, 3, 5)
q3 <- c(5, 4, 4,NA, 2, 5, 4, 5)
q4 <- c(1, 1, 3, 3, 4, 5, 4, 5)
# Selecting Elements of Vectors
q1[5]
q1[ c(5, 6, 7, 8) ]
q1[5:8]
q1[gender == "m"]
mean( q1[ gender == "m" ], na.rm = TRUE)
# ---Factors---
# Numeric Factors
# First, as a vector
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
workshop
table(workshop)
mean(workshop)
gender[workshop == 2]
# Now as a factor
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
workshop <- factor(workshop)
workshop
table(workshop)
mean(workshop) #generates error now.
gender[workshop == 2]
gender[workshop == "2"]
# Recreate workshop, making it a factor
# including levels that don't yet exist.
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
workshop <- factor(
workshop,
levels = c( 1, 2, 3, 4),
labels = c("R", "SAS", "SPSS", "Stata")
)
# Recreate it with just the levels it
# curently has.
workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
workshop <- factor(
workshop,
levels = c( 1, 2),
labels = c("R","SAS")
)
workshop
table(workshop)
gender[workshop == 2]
gender[workshop == "2"]
gender[workshop == "SAS"]
# Character factors
gender <- c("f", "f", "f", NA, "m", "m", "m", "m")
gender <- factor(
gender,
levels = c("m", "f"),
labels = c("Male", "Female")
)
gender
table(gender)
workshop[gender == "m"]
workshop[gender == "Male"]
# Recreate gender and make it a factor,
# keeping simpler m and f as labels.
gender <- c("f", "f", "f", NA, "m", "m", "m", "m")
gender <- factor(gender)
gender
# Data Frames
mydata <- data.frame(workshop, gender, q1, q2, q3, q4)
mydata
names(mydata)
row.names(mydata)
# Selecting components by index number
mydata[8, 6] #8th obs, 6th var
mydata[ , 6] #All obs, 6th var
mydata[ , 6][5:8] #6th var, obs 5:8
# Selecting components by name
mydata$q1
mydata$q1[5:8]
# Example renaming gender to sex while
# creating a data frame (left as a comment)
#
# mydata <- data.frame(workshop, sex = gender,
# q1, q2, q3, q4)
# Matrices
# Creating from vectors
mymatrix <- cbind(q1, q2, q3, q4)
mymatrix
dim(mymatrix)
# Creating from matrix function
# left as a comment so we keep
# version with names q1, q2...
#
# mymatrix <- matrix(
# c(1, 1, 5, 1,
# 2, 1, 4, 1,
# 2, 2, 4, 3,
# 3, 1, NA,3,
# 4, 5, 2, 4,
# 5, 4, 5, 5,
# 5, 3, 4, 4,
# 4, 5, 5, 5),
# nrow = 8, ncol = 4, byrow = TRUE)
# mymatrix
table(mymatrix)
mean(mymatrix, na.rm = TRUE)
cor(mymatrix, use = "pairwise")
# Selecting Subsets of Matrices
mymatrix[8, 4]
mymatrix[5:8, 3:4]
mymatrix[ ,4][1:4]
mymatrix$q4 # No good!
mymatrix[ ,"q4"]
# Matrix Algebra
mymatrixT <- t(mymatrix)
mymatrixT
# Lists
mylist <- list(workshop, gender,
q1, q2, q3, q4, mymatrix)
mylist
# List, this time adding names
mylist <- list(
workshop = workshop,
gender = gender,
q1 = q1,
q2 = q2,
q3 = q3,
q4 = q4,
mymatrix = mymatrix)
mylist
# Selecting components by index number.
mylist[[2]]
mylist[[2]][5:8]
mylist[2]
mylist[2][5:8] # Bad!
# Selecting components by name.
mylist$q1
mylist$mymatrix[5:8, 3:4]
# ---Saving Your Work---
ls()
objects() #same as ls()
save.image("myall.RData")
save(mydata, file = "mydata.RData")
# The 2nd approach is commented to keep
# the q variables for following examples.
# rm(x, y, workshop, gender, q1, q2, q3, q4, mylist)
# ls()
# save.image(file = "mydata.RData")
# ---Comments to Document Your Programs---
# This comment is on its own line, between functions.
workshop <- c(1, 2, 1, 2, #This comment is within the arguments.
1, 2, 1, 2) # And this is at the end.
# ---Comments to Document Your Objects---
comment(mydata) <- "Example data from R for SAS and SPSS Users"
comment(mydata)
# ---Controlling Functions---
# Controlling Functions with Arguments
help("mean")
mean(x = q3, trim = .25, na.rm = TRUE)
mean(na.rm = TRUE, x = q3, trim = .25)
mean(q3, .25, TRUE)
mean(q3, t = .25, na.rm = TRUE)
mean(1, 2, 3)
mean( c(1, 2, 3) )
mean( 1:3 )
# Controlling Functions With Formulas
lm( q4 ~ q1 + q2 + q3, data = mydata )
t.test(q1 ~ gender, data = mydata)
t.test( q1[ which(gender == "Female") ],
q1[ which(gender == "Male") ],
data = mydata) # Data ignored!
# Controlling Functions with Extractor Functions
lm( q4 ~ q1 + q2 + q3, data = mydata )
myModel <- lm( q4 ~ q1 + q2 + q3, data = mydata )
class(myModel)
summary(myModel)
# How Much Output Is There?
print(mymodel)
mode(myModel)
class(myModel)
names(myModel)
print( unclass(myModel) )
myModel$coefficients
class( myModel$coefficients )
barplot( myModel$coefficients )
# ---Writing Your Own Functions (Macros)---
myvar <- c(1, 2, 3, 4, 5)
# A bad function.
mystats <- function(x) {
mean(x, na.rm = TRUE)
sd(x, na.rm = TRUE)
}
mystats(myvar)
# A good function that just prints.
mystats <- function(x) {
print( mean(x, na.rm = TRUE) )
print( sd(x, na.rm = TRUE) )
}
mystats(myvar)
# A function with vector output.
mystats <- function(x) {
mymean <- mean(x, na.rm = TRUE)
mysd <- sd(x, na.rm = TRUE)
c(mean = mymean, sd = mysd )
}
mystats(myvar)
myVector <- mystats(myvar)
myVector
# A function with list output.
mystats <- function(x) {
myinput <- x
mymean <- mean(x, na.rm = TRUE)
mysd <- sd(x, na.rm = TRUE)
list(data = myinput, mean = mymean, sd = mysd)
}
mystats(myvar)
myStatlist <- mystats(myvar)
myStatlist
mystats
save(mydata, mymatrix, mylist, mystats,
file = "myWorkspace.RData")

R is a very flexible and powerful programming language, as well as a.pdf

  • 1.
    R is avery flexible and powerful programming language, as well as a package that is written using that language (and others like C). The following program demonstrates many of its basic features. You can cut and paste it into R, or download the file that includes it from here. If you run it line by line, many of its features will become clear. Both editions of R for SAS and SPSS Users and R for Stata Users work through a version of this program line-by-line, showing the output and explaining what R is doing. # Filename: ProgrammingBasics.R # ---Simple Calculations--- 2 + 3 x <- 2 y <- 3 x + y x * y # ---Data Structures--- # Vectors workshop <- c(1, 2, 1, 2, 1, 2, 1, 2) print(workshop) workshop gender <- c("f", "f", "f", NA, "m", "m", "m", "m") q1 <- c(1, 2, 2, 3, 4, 5, 5, 4) q2 <- c(1, 1, 2, 1, 5, 4, 3, 5) q3 <- c(5, 4, 4,NA, 2, 5, 4, 5) q4 <- c(1, 1, 3, 3, 4, 5, 4, 5) # Selecting Elements of Vectors q1[5] q1[ c(5, 6, 7, 8) ] q1[5:8] q1[gender == "m"] mean( q1[ gender == "m" ], na.rm = TRUE) # ---Factors--- # Numeric Factors # First, as a vector workshop <- c(1, 2, 1, 2, 1, 2, 1, 2) workshop table(workshop)
  • 2.
    mean(workshop) gender[workshop == 2] #Now as a factor workshop <- c(1, 2, 1, 2, 1, 2, 1, 2) workshop <- factor(workshop) workshop table(workshop) mean(workshop) #generates error now. gender[workshop == 2] gender[workshop == "2"] # Recreate workshop, making it a factor # including levels that don't yet exist. workshop <- c(1, 2, 1, 2, 1, 2, 1, 2) workshop <- factor( workshop, levels = c( 1, 2, 3, 4), labels = c("R", "SAS", "SPSS", "Stata") ) # Recreate it with just the levels it # curently has. workshop <- c(1, 2, 1, 2, 1, 2, 1, 2) workshop <- factor( workshop, levels = c( 1, 2), labels = c("R","SAS") ) workshop table(workshop) gender[workshop == 2] gender[workshop == "2"] gender[workshop == "SAS"] # Character factors gender <- c("f", "f", "f", NA, "m", "m", "m", "m") gender <- factor( gender, levels = c("m", "f"),
  • 3.
    labels = c("Male","Female") ) gender table(gender) workshop[gender == "m"] workshop[gender == "Male"] # Recreate gender and make it a factor, # keeping simpler m and f as labels. gender <- c("f", "f", "f", NA, "m", "m", "m", "m") gender <- factor(gender) gender # Data Frames mydata <- data.frame(workshop, gender, q1, q2, q3, q4) mydata names(mydata) row.names(mydata) # Selecting components by index number mydata[8, 6] #8th obs, 6th var mydata[ , 6] #All obs, 6th var mydata[ , 6][5:8] #6th var, obs 5:8 # Selecting components by name mydata$q1 mydata$q1[5:8] # Example renaming gender to sex while # creating a data frame (left as a comment) # # mydata <- data.frame(workshop, sex = gender, # q1, q2, q3, q4) # Matrices # Creating from vectors mymatrix <- cbind(q1, q2, q3, q4) mymatrix dim(mymatrix) # Creating from matrix function # left as a comment so we keep # version with names q1, q2...
  • 4.
    # # mymatrix <-matrix( # c(1, 1, 5, 1, # 2, 1, 4, 1, # 2, 2, 4, 3, # 3, 1, NA,3, # 4, 5, 2, 4, # 5, 4, 5, 5, # 5, 3, 4, 4, # 4, 5, 5, 5), # nrow = 8, ncol = 4, byrow = TRUE) # mymatrix table(mymatrix) mean(mymatrix, na.rm = TRUE) cor(mymatrix, use = "pairwise") # Selecting Subsets of Matrices mymatrix[8, 4] mymatrix[5:8, 3:4] mymatrix[ ,4][1:4] mymatrix$q4 # No good! mymatrix[ ,"q4"] # Matrix Algebra mymatrixT <- t(mymatrix) mymatrixT # Lists mylist <- list(workshop, gender, q1, q2, q3, q4, mymatrix) mylist # List, this time adding names mylist <- list( workshop = workshop, gender = gender, q1 = q1, q2 = q2, q3 = q3, q4 = q4,
  • 5.
    mymatrix = mymatrix) mylist #Selecting components by index number. mylist[[2]] mylist[[2]][5:8] mylist[2] mylist[2][5:8] # Bad! # Selecting components by name. mylist$q1 mylist$mymatrix[5:8, 3:4] # ---Saving Your Work--- ls() objects() #same as ls() save.image("myall.RData") save(mydata, file = "mydata.RData") # The 2nd approach is commented to keep # the q variables for following examples. # rm(x, y, workshop, gender, q1, q2, q3, q4, mylist) # ls() # save.image(file = "mydata.RData") # ---Comments to Document Your Programs--- # This comment is on its own line, between functions. workshop <- c(1, 2, 1, 2, #This comment is within the arguments. 1, 2, 1, 2) # And this is at the end. # ---Comments to Document Your Objects--- comment(mydata) <- "Example data from R for SAS and SPSS Users" comment(mydata) # ---Controlling Functions--- # Controlling Functions with Arguments help("mean") mean(x = q3, trim = .25, na.rm = TRUE) mean(na.rm = TRUE, x = q3, trim = .25) mean(q3, .25, TRUE) mean(q3, t = .25, na.rm = TRUE) mean(1, 2, 3) mean( c(1, 2, 3) )
  • 6.
    mean( 1:3 ) #Controlling Functions With Formulas lm( q4 ~ q1 + q2 + q3, data = mydata ) t.test(q1 ~ gender, data = mydata) t.test( q1[ which(gender == "Female") ], q1[ which(gender == "Male") ], data = mydata) # Data ignored! # Controlling Functions with Extractor Functions lm( q4 ~ q1 + q2 + q3, data = mydata ) myModel <- lm( q4 ~ q1 + q2 + q3, data = mydata ) class(myModel) summary(myModel) # How Much Output Is There? print(mymodel) mode(myModel) class(myModel) names(myModel) print( unclass(myModel) ) myModel$coefficients class( myModel$coefficients ) barplot( myModel$coefficients ) # ---Writing Your Own Functions (Macros)--- myvar <- c(1, 2, 3, 4, 5) # A bad function. mystats <- function(x) { mean(x, na.rm = TRUE) sd(x, na.rm = TRUE) } mystats(myvar) # A good function that just prints. mystats <- function(x) { print( mean(x, na.rm = TRUE) ) print( sd(x, na.rm = TRUE) ) } mystats(myvar) # A function with vector output.
  • 7.
    mystats <- function(x){ mymean <- mean(x, na.rm = TRUE) mysd <- sd(x, na.rm = TRUE) c(mean = mymean, sd = mysd ) } mystats(myvar) myVector <- mystats(myvar) myVector # A function with list output. mystats <- function(x) { myinput <- x mymean <- mean(x, na.rm = TRUE) mysd <- sd(x, na.rm = TRUE) list(data = myinput, mean = mymean, sd = mysd) } mystats(myvar) myStatlist <- mystats(myvar) myStatlist mystats save(mydata, mymatrix, mylist, mystats, file = "myWorkspace.RData") Solution R is a very flexible and powerful programming language, as well as a package that is written using that language (and others like C). The following program demonstrates many of its basic features. You can cut and paste it into R, or download the file that includes it from here. If you run it line by line, many of its features will become clear. Both editions of R for SAS and SPSS Users and R for Stata Users work through a version of this program line-by-line, showing the output and explaining what R is doing. # Filename: ProgrammingBasics.R # ---Simple Calculations--- 2 + 3 x <- 2 y <- 3 x + y
  • 8.
    x * y #---Data Structures--- # Vectors workshop <- c(1, 2, 1, 2, 1, 2, 1, 2) print(workshop) workshop gender <- c("f", "f", "f", NA, "m", "m", "m", "m") q1 <- c(1, 2, 2, 3, 4, 5, 5, 4) q2 <- c(1, 1, 2, 1, 5, 4, 3, 5) q3 <- c(5, 4, 4,NA, 2, 5, 4, 5) q4 <- c(1, 1, 3, 3, 4, 5, 4, 5) # Selecting Elements of Vectors q1[5] q1[ c(5, 6, 7, 8) ] q1[5:8] q1[gender == "m"] mean( q1[ gender == "m" ], na.rm = TRUE) # ---Factors--- # Numeric Factors # First, as a vector workshop <- c(1, 2, 1, 2, 1, 2, 1, 2) workshop table(workshop) mean(workshop) gender[workshop == 2] # Now as a factor workshop <- c(1, 2, 1, 2, 1, 2, 1, 2) workshop <- factor(workshop) workshop table(workshop) mean(workshop) #generates error now. gender[workshop == 2] gender[workshop == "2"] # Recreate workshop, making it a factor # including levels that don't yet exist. workshop <- c(1, 2, 1, 2, 1, 2, 1, 2)
  • 9.
    workshop <- factor( workshop, levels= c( 1, 2, 3, 4), labels = c("R", "SAS", "SPSS", "Stata") ) # Recreate it with just the levels it # curently has. workshop <- c(1, 2, 1, 2, 1, 2, 1, 2) workshop <- factor( workshop, levels = c( 1, 2), labels = c("R","SAS") ) workshop table(workshop) gender[workshop == 2] gender[workshop == "2"] gender[workshop == "SAS"] # Character factors gender <- c("f", "f", "f", NA, "m", "m", "m", "m") gender <- factor( gender, levels = c("m", "f"), labels = c("Male", "Female") ) gender table(gender) workshop[gender == "m"] workshop[gender == "Male"] # Recreate gender and make it a factor, # keeping simpler m and f as labels. gender <- c("f", "f", "f", NA, "m", "m", "m", "m") gender <- factor(gender) gender # Data Frames mydata <- data.frame(workshop, gender, q1, q2, q3, q4)
  • 10.
    mydata names(mydata) row.names(mydata) # Selecting componentsby index number mydata[8, 6] #8th obs, 6th var mydata[ , 6] #All obs, 6th var mydata[ , 6][5:8] #6th var, obs 5:8 # Selecting components by name mydata$q1 mydata$q1[5:8] # Example renaming gender to sex while # creating a data frame (left as a comment) # # mydata <- data.frame(workshop, sex = gender, # q1, q2, q3, q4) # Matrices # Creating from vectors mymatrix <- cbind(q1, q2, q3, q4) mymatrix dim(mymatrix) # Creating from matrix function # left as a comment so we keep # version with names q1, q2... # # mymatrix <- matrix( # c(1, 1, 5, 1, # 2, 1, 4, 1, # 2, 2, 4, 3, # 3, 1, NA,3, # 4, 5, 2, 4, # 5, 4, 5, 5, # 5, 3, 4, 4, # 4, 5, 5, 5), # nrow = 8, ncol = 4, byrow = TRUE) # mymatrix table(mymatrix)
  • 11.
    mean(mymatrix, na.rm =TRUE) cor(mymatrix, use = "pairwise") # Selecting Subsets of Matrices mymatrix[8, 4] mymatrix[5:8, 3:4] mymatrix[ ,4][1:4] mymatrix$q4 # No good! mymatrix[ ,"q4"] # Matrix Algebra mymatrixT <- t(mymatrix) mymatrixT # Lists mylist <- list(workshop, gender, q1, q2, q3, q4, mymatrix) mylist # List, this time adding names mylist <- list( workshop = workshop, gender = gender, q1 = q1, q2 = q2, q3 = q3, q4 = q4, mymatrix = mymatrix) mylist # Selecting components by index number. mylist[[2]] mylist[[2]][5:8] mylist[2] mylist[2][5:8] # Bad! # Selecting components by name. mylist$q1 mylist$mymatrix[5:8, 3:4] # ---Saving Your Work--- ls() objects() #same as ls()
  • 12.
    save.image("myall.RData") save(mydata, file ="mydata.RData") # The 2nd approach is commented to keep # the q variables for following examples. # rm(x, y, workshop, gender, q1, q2, q3, q4, mylist) # ls() # save.image(file = "mydata.RData") # ---Comments to Document Your Programs--- # This comment is on its own line, between functions. workshop <- c(1, 2, 1, 2, #This comment is within the arguments. 1, 2, 1, 2) # And this is at the end. # ---Comments to Document Your Objects--- comment(mydata) <- "Example data from R for SAS and SPSS Users" comment(mydata) # ---Controlling Functions--- # Controlling Functions with Arguments help("mean") mean(x = q3, trim = .25, na.rm = TRUE) mean(na.rm = TRUE, x = q3, trim = .25) mean(q3, .25, TRUE) mean(q3, t = .25, na.rm = TRUE) mean(1, 2, 3) mean( c(1, 2, 3) ) mean( 1:3 ) # Controlling Functions With Formulas lm( q4 ~ q1 + q2 + q3, data = mydata ) t.test(q1 ~ gender, data = mydata) t.test( q1[ which(gender == "Female") ], q1[ which(gender == "Male") ], data = mydata) # Data ignored! # Controlling Functions with Extractor Functions lm( q4 ~ q1 + q2 + q3, data = mydata ) myModel <- lm( q4 ~ q1 + q2 + q3, data = mydata ) class(myModel) summary(myModel) # How Much Output Is There?
  • 13.
    print(mymodel) mode(myModel) class(myModel) names(myModel) print( unclass(myModel) ) myModel$coefficients class(myModel$coefficients ) barplot( myModel$coefficients ) # ---Writing Your Own Functions (Macros)--- myvar <- c(1, 2, 3, 4, 5) # A bad function. mystats <- function(x) { mean(x, na.rm = TRUE) sd(x, na.rm = TRUE) } mystats(myvar) # A good function that just prints. mystats <- function(x) { print( mean(x, na.rm = TRUE) ) print( sd(x, na.rm = TRUE) ) } mystats(myvar) # A function with vector output. mystats <- function(x) { mymean <- mean(x, na.rm = TRUE) mysd <- sd(x, na.rm = TRUE) c(mean = mymean, sd = mysd ) } mystats(myvar) myVector <- mystats(myvar) myVector # A function with list output. mystats <- function(x) { myinput <- x mymean <- mean(x, na.rm = TRUE) mysd <- sd(x, na.rm = TRUE)
  • 14.
    list(data = myinput,mean = mymean, sd = mysd) } mystats(myvar) myStatlist <- mystats(myvar) myStatlist mystats save(mydata, mymatrix, mylist, mystats, file = "myWorkspace.RData")