Introduction to R

February 3, 2026

Introduction

This was originally a plain .R script. Early in the file we were trying to read in a data set stored on a shared folder on Buddy. The shared folder was a relatively new Buddy feature (to me at least) and I couldn’t fully test it. It turned out that data from a shared folder had to be copied to an “owned” folder before use. Specifically we could not successfully set our working directory to the directory name of the shared folder.

The contents below do reflect the setup of a typical script. Below # and ## are used for comments (with no difference between one or two), but in .qmd these are interpreted as section headings (with one or two referring to different heading levels).

# getwd()
# setwd("/home/slaverty")
getwd()
[1] "/Users/seanlaverty/GitHub/DVE/notes"
dir()
 [1] "bird"                "dashboard"           "data"               
 [4] "figures"             "ggplot"              "index.html"         
 [7] "index.qmd"           "notes.Rproj"         "notes0120.R"        
[10] "notes0203"           "notes0203.qmd"       "notes0203.R"        
[13] "notes0203.rmarkdown" "notes0203.zip"       "notes0210.qmd"      
[16] "notes0210.zip"       "notes0217.qmd"       "notes0224.qmd"      
[19] "notes0224b.qmd"      "notes0324.R"         "notes0331.qmd"      
[22] "notes0407.qmd"       "notes0407b.qmd"      "notes0414.qmd"      
[25] "notes0421.qmd"       "notes0428.qmd"       "notes0428x.qmd"     
[28] "nvidia-whtd.png"     "sample"              "scratchwork.R"      
## setwd("STAT-4413-5413-share")
## dat <- read.delim("./STAT-4413-5413-share/cards.csv")

dat <- read.delim("./../data/cards.csv", header = TRUE, sep = ',')
## check out "head"
head(dat)
     X Card Time1 Time2
1 1990    A          NA
2 1990    B          NA
3 1990    C  3.26    NA
4 1990    D  3.25    NA
5 1990    E          NA
6 KL05    A  1.28  0.71
## check out variable types
str(dat)
'data.frame':   119 obs. of  4 variables:
 $ X    : chr  "1990" "1990" "1990" "1990" ...
 $ Card : chr  "A" "B" "C" "D" ...
 $ Time1: chr  "" "" "3.26" "3.25" ...
 $ Time2: num  NA NA NA NA NA 0.71 1.03 1.34 0.83 1.38 ...
## check "tail", can specify amount of lines
tail(dat, n = 10)
       X Card Time1 Time2
110   Ew    A  1.05  0.97
111         B  1.19  1.27
112         C  2.O8  1.32
113         D  2.99  7.65
114         E  6.11    NA
115 WG28    A  0.86    NA
116 WG29    B  0.79    NA
117 WG30    C  0.86    NA
118 WG31    D  3.88    NA
119 WG32    E 11.42    NA
## summaries
summary(dat)
      X                 Card              Time1               Time2      
 Length:119         Length:119         Length:119         Min.   :0.440  
 Class :character   Class :character   Class :character   1st Qu.:0.980  
 Mode  :character   Mode  :character   Mode  :character   Median :1.360  
                                                          Mean   :1.718  
                                                          3rd Qu.:2.310  
                                                          Max.   :7.650  
                                                          NA's   :30     
## convert Time1 to numbers
dat$Time1 <- as.numeric(dat$Time1)
Warning: NAs introduced by coercion
summary(dat)
      X                 Card               Time1            Time2      
 Length:119         Length:119         Min.   : 0.580   Min.   :0.440  
 Class :character   Class :character   1st Qu.: 1.060   1st Qu.:0.980  
 Mode  :character   Mode  :character   Median : 1.745   Median :1.360  
                                       Mean   : 2.753   Mean   :1.718  
                                       3rd Qu.: 3.245   3rd Qu.:2.310  
                                       Max.   :22.340   Max.   :7.650  
                                       NA's   :17       NA's   :30     
boxplot(Time1 ~ Card, data = dat)

## what's that weird empty tick?
table(dat$Card)

    A  B  C  D  E 
 8 23 23 22 21 22 
## a visual diagnostic
plot(table(dat$Card))

## remove empty cards
(card <- dat$Card) ## ()'s around assignments prints output
  [1] "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C"
 [19] "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A"
 [37] "B" "C" "D" "E" "A" "B" "C" ""  "E" "A" "B" "A" "B" "C" "D" "E" "A" "B"
 [55] "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E"
 [73] ""  "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B"
 [91] "C" "D" "E" ""  ""  ""  ""  ""  ""  "A" "B" "C" "D" "E" "A" "C" "D" "B"
[109] "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E"
## remove empty rows
dat <- dat[dat$Card != "", ]
head(dat)
     X Card Time1 Time2
1 1990    A    NA    NA
2 1990    B    NA    NA
3 1990    C  3.26    NA
4 1990    D  3.25    NA
5 1990    E    NA    NA
6 KL05    A  1.28  0.71
dim(dat)
[1] 111   4
## so a cleaned up plot
boxplot(Time1 ~ Card, data = dat)

## exploring data
dat[1, 2] ## dat[1st row, 2nd column]
[1] "A"
dat[1, "Card"] ## dat[1st row, "Card" column]
[1] "A"
dat[1:3, ] ## dat[first three rows, all columns]
     X Card Time1 Time2
1 1990    A    NA    NA
2 1990    B    NA    NA
3 1990    C  3.26    NA
## equivalent approaches
dat[ , "Card"]
  [1] "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C"
 [19] "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A"
 [37] "B" "C" "D" "E" "A" "B" "C" "E" "A" "B" "A" "B" "C" "D" "E" "A" "B" "C"
 [55] "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A"
 [73] "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D"
 [91] "E" "A" "B" "C" "D" "E" "A" "C" "D" "B" "E" "A" "B" "C" "D" "E" "A" "B"
[109] "C" "D" "E"
dat$Card
  [1] "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C"
 [19] "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A"
 [37] "B" "C" "D" "E" "A" "B" "C" "E" "A" "B" "A" "B" "C" "D" "E" "A" "B" "C"
 [55] "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A"
 [73] "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D"
 [91] "E" "A" "B" "C" "D" "E" "A" "C" "D" "B" "E" "A" "B" "C" "D" "E" "A" "B"
[109] "C" "D" "E"
dat[ , 2]
  [1] "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C"
 [19] "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A"
 [37] "B" "C" "D" "E" "A" "B" "C" "E" "A" "B" "A" "B" "C" "D" "E" "A" "B" "C"
 [55] "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A"
 [73] "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D" "E" "A" "B" "C" "D"
 [91] "E" "A" "B" "C" "D" "E" "A" "C" "D" "B" "E" "A" "B" "C" "D" "E" "A" "B"
[109] "C" "D" "E"
## more columns
dat[1:5 , c("Time1", "Time2")]
  Time1 Time2
1    NA    NA
2    NA    NA
3  3.26    NA
4  3.25    NA
5    NA    NA
dat[1:5, 2:3]
  Card Time1
1    A    NA
2    B    NA
3    C  3.26
4    D  3.25
5    E    NA