Question One

# I would like to set seed first to avoid changing results or conflicts
set.seed(123)

# assigning a single random inter between 3 and 10 to n_dims
n_dims <- sample(3:10, size = 1)

print(n_dims)
## [1] 9
#create a vector of consecutive integers from 1:n_dims^2
vec <- c(1:n_dims ^ 2)
print(vec)
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
## [51] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
## [76] 76 77 78 79 80 81
# randomly sample to reshuffle the values in the new vector
shuffled_vec <- sample(vec)

# creating a square matrix with the shuffled elements
shuf_matrix <- matrix(shuffled_vec, nrow = n_dims, ncol=n_dims)
print(shuf_matrix)
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
##  [1,]   79   69   17   68   38   33   16   37   30
##  [2,]   51   57   75   66   73   47   20   19   61
##  [3,]   14    9   39   41   34   44    6    2    1
##  [4,]   67   26   53   10   29   21   11    4   76
##  [5,]   42    7   12   23    5   58   40   55   65
##  [6,]   50   77   15   27    8   60   22   52   24
##  [7,]   43   70   32   54   59   46   48   62   80
##  [8,]   81   36   78   49   13   72   35    3   56
##  [9,]   25   74   45   71   18   28   63   31   64
# transposinng the matrix
trns_matrix <- t(shuf_matrix)

print(trns_matrix)
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
##  [1,]   79   51   14   67   42   50   43   81   25
##  [2,]   69   57    9   26    7   77   70   36   74
##  [3,]   17   75   39   53   12   15   32   78   45
##  [4,]   68   66   41   10   23   27   54   49   71
##  [5,]   38   73   34   29    5    8   59   13   18
##  [6,]   33   47   44   21   58   60   46   72   28
##  [7,]   16   20    6   11   40   22   48   35   63
##  [8,]   37   19    2    4   55   52   62    3   31
##  [9,]   30   61    1   76   65   24   80   56   64
nrow(trns_matrix)
## [1] 9
# calculating the sum and means of elements in the first and last rows
sum(trns_matrix[1,] )
## [1] 452
sum(trns_matrix[9,])
## [1] 457
mean(trns_matrix[1,])
## [1] 50.22222
mean(trns_matrix[9,])
## [1] 50.77778
# using the eigen function on my matrix
eigen_output <- eigen(trns_matrix)

print(eigen_output) #looks like we generated a bunch of characteristic roots
## eigen() decomposition
## $values
## [1] 366.849540+ 0.000000i -65.760156+ 0.000000i  52.937905+ 9.156369i
## [4]  52.937905- 9.156369i -10.070124+51.982021i -10.070124-51.982021i
## [7] -20.974240+ 0.000000i  -6.170663+ 0.000000i   5.319955+ 0.000000i
## 
## $vectors
##                [,1]           [,2]                    [,3]
##  [1,] -0.4003557+0i -0.36467251+0i -0.76423243+0.00000000i
##  [2,] -0.3925288+0i  0.20435520+0i -0.08156143-0.07501265i
##  [3,] -0.3256978+0i -0.38498423+0i  0.16136070-0.02821235i
##  [4,] -0.3722517+0i  0.53589482+0i -0.15984157+0.07690690i
##  [5,] -0.2533823+0i -0.16921595+0i -0.07220939+0.02833808i
##  [6,] -0.3458081+0i  0.02571944+0i  0.11695642-0.24288909i
##  [7,] -0.2223479+0i  0.23676330+0i  0.41662389+0.07429501i
##  [8,] -0.2264092+0i  0.24509906+0i  0.07916646-0.05702481i
##  [9,] -0.3956015+0i -0.49439949+0i  0.21540516+0.17795365i
##                          [,4]                      [,5]
##  [1,] -0.76423243+0.00000000i  0.001366297-0.007970864i
##  [2,] -0.08156143+0.07501265i  0.065103067-0.528549816i
##  [3,]  0.16136070+0.02821235i -0.324505989-0.015871722i
##  [4,] -0.15984157-0.07690690i -0.134854437-0.014311775i
##  [5,] -0.07220939-0.02833808i -0.583284549+0.000000000i
##  [6,]  0.11695642+0.24288909i  0.130232522+0.221638489i
##  [7,]  0.41662389-0.07429501i  0.267355744+0.038508831i
##  [8,]  0.07916646+0.05702481i  0.224083810+0.136221495i
##  [9,]  0.21540516-0.17795365i -0.044401622+0.205855081i
##                            [,6]             [,7]           [,8]           [,9]
##  [1,]  0.001366297+0.007970864i -0.0003187299+0i -0.02780909+0i  0.04579170+0i
##  [2,]  0.065103067+0.528549816i -0.5030079251+0i  0.54641266+0i -0.29322221+0i
##  [3,] -0.324505989+0.015871722i  0.4669183595+0i -0.59977548+0i  0.60725383+0i
##  [4,] -0.134854437+0.014311775i  0.4991421550+0i -0.46009679+0i  0.48913052+0i
##  [5,] -0.583284549+0.000000000i -0.2383286204+0i  0.14400181+0i  0.06515207+0i
##  [6,]  0.130232522-0.221638489i  0.2259489336+0i -0.10272184+0i  0.08164658+0i
##  [7,]  0.267355744-0.038508831i  0.2529626854+0i -0.11816203+0i -0.26169116+0i
##  [8,]  0.224083810-0.136221495i -0.3285513726+0i  0.26026039+0i -0.39337110+0i
##  [9,] -0.044401622-0.205855081i  0.0061403449+0i -0.12749175+0i  0.26416650+0i
# digging in to find out  the actual types of numbers generated
typeof(eigen_output$values)
## [1] "complex"
typeof(eigen_output$vectors) #They are all complex numbers of latent roots
## [1] "complex"

Question 2

# a 4 x 4 matrix filled with random uniform values
my_matrix <- matrix(data=runif(16), nrow=4, ncol=4)
print(my_matrix)
##            [,1]      [,2]      [,3]      [,4]
## [1,] 0.30122890 0.1422943 0.4045103 0.2197676
## [2,] 0.06072057 0.5492847 0.6478935 0.3694889
## [3,] 0.94772694 0.9540912 0.3198206 0.9842192
## [4,] 0.72059627 0.5854834 0.3077200 0.1542023
# a 100-element vector of TRUE or FALSE values
my_logical <- sample(c(TRUE, FALSE), size = 100, replace = TRUE)
print(my_logical)
##   [1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [13]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE
##  [25] FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [37] FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE
##  [49]  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [61]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE
##  [73] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
##  [85]  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE
##  [97]  TRUE FALSE FALSE  TRUE
# a 26-element vector of all the lower-case letters in random order
my_letters <- sample(letters, size = 26, replace = FALSE)
print(my_letters)
##  [1] "m" "b" "k" "z" "n" "f" "h" "l" "d" "w" "q" "v" "e" "g" "a" "t" "x" "i" "j"
## [20] "y" "o" "u" "s" "c" "r" "p"
# a new list, which has the element[2,2] from the matrix, the second element of the logical vector, and the second element of the letters vector
my_list <- list(c(my_matrix[2,2], my_logical[2], my_letters[2]))
print(my_list)
## [[1]]
## [1] "0.549284656066447" "TRUE"              "b"
typeof(my_matrix[2,2])
## [1] "double"
typeof(my_logical[2])
## [1] "logical"
typeof(my_letters[2])
## [1] "character"
typeof(my_list) # its a list
## [1] "list"

Question 3

# creating a dataframe with two variables
my_unis <- runif(26, min = 0, max =10)
my_letters <- sample(LETTERS, size = 26, replace = FALSE)

my_df <- data.frame(my_unis, my_letters)

print(my_df)
##       my_unis my_letters
## 1  8.68106807          Z
## 2  9.25707956          T
## 3  8.81977559          X
## 4  6.74186843          I
## 5  9.50166979          W
## 6  5.16444894          E
## 7  5.76519021          N
## 8  3.36331206          Y
## 9  3.47324631          F
## 10 0.20024301          A
## 11 5.02813046          J
## 12 8.71043414          P
## 13 0.06300784          Q
## 14 0.72057124          O
## 15 1.64211225          S
## 16 7.70334074          M
## 17 7.35184306          U
## 18 9.71875636          G
## 19 4.66472377          D
## 20 0.74384513          K
## 21 6.48818124          B
## 22 7.58593170          L
## 23 1.37106081          H
## 24 3.96584595          R
## 25 2.24985329          C
## 26 0.57958561          V
#selecting four random rows and replacing them with NAs in my df
my_df$my_unis <- replace(my_df$my_unis, list=sample(my_df$my_unis, size = 4), values=NA)

print(my_df)
##       my_unis my_letters
## 1  8.68106807          Z
## 2  9.25707956          T
## 3  8.81977559          X
## 4  6.74186843          I
## 5  9.50166979          W
## 6  5.16444894          E
## 7          NA          N
## 8          NA          Y
## 9          NA          F
## 10 0.20024301          A
## 11 5.02813046          J
## 12 8.71043414          P
## 13 0.06300784          Q
## 14 0.72057124          O
## 15 1.64211225          S
## 16 7.70334074          M
## 17 7.35184306          U
## 18 9.71875636          G
## 19 4.66472377          D
## 20 0.74384513          K
## 21 6.48818124          B
## 22 7.58593170          L
## 23 1.37106081          H
## 24 3.96584595          R
## 25 2.24985329          C
## 26 0.57958561          V
# identifying the portions of the first variable with missing spots
which(is.na(my_df$my_unis))
## [1] 7 8 9
# rearrage the second column in alphabetical order
my_df[order(my_df$my_letters),]
##       my_unis my_letters
## 10 0.20024301          A
## 21 6.48818124          B
## 25 2.24985329          C
## 19 4.66472377          D
## 6  5.16444894          E
## 9          NA          F
## 18 9.71875636          G
## 23 1.37106081          H
## 4  6.74186843          I
## 11 5.02813046          J
## 20 0.74384513          K
## 22 7.58593170          L
## 16 7.70334074          M
## 7          NA          N
## 14 0.72057124          O
## 12 8.71043414          P
## 13 0.06300784          Q
## 24 3.96584595          R
## 15 1.64211225          S
## 2  9.25707956          T
## 17 7.35184306          U
## 26 0.57958561          V
## 5  9.50166979          W
## 3  8.81977559          X
## 8          NA          Y
## 1  8.68106807          Z
#calculating the mean of the first variable
d <- mean(my_df$my_unis, na.rm = TRUE)
print(d)
## [1] 5.084929