# --------------------------------------------------------------------------- # One way of writing the multipy_above_diagonal function. # # Note that the check for n > 1 is needed because for (i in 1:(n-1)) # will not do nothing when n is 0 or 1, because of the design flaw # in R noted in the week 8 lecture slides. multiply_above_diagonal <- function (M) { n <- nrow(M) product <- 1 if (n > 1) { for (i in 1:(n-1)) { for (j in (i+1):n) { product <- product * M[i,j] } } } product } # --------------------------------------------------------------------------- # A solution for find_longest_run. longest_run <- function (v) { if (length(v) < 2) return (length(v)) run <- 1 longest_run <- 1 for (i in 2:length(v)) { if (v[i]==v[i-1]) run <- run + 1 else run <- 1 if (run > longest_run) longest_run <- run } longest_run } # --------------------------------------------------------------------------- # One way to write the simple version of swap_born_died. swap_born_died <- function (df) { new_df <- df for (i in 1:nrow(df)) { if (df$born[i] > df$died[i]) { new_df$born[i] <- df$died[i] new_df$died[i] <- df$born[i] } } new_df } # Two ways to write a version of swap_born_died that handles NA. swap_born_died2 <- function (df) { new_df <- df for (i in 1:nrow(df)) { if (!is.na(df$born[i]) && !is.na(df$died[i]) && df$born[i]>df$died[i]) { new_df$born[i] <- df$died[i] new_df$died[i] <- df$born[i] } } new_df } swap_born_died2 <- function (df) { new_df <- df sw <- !is.na(df$born) & !is.na(df$died) & df$born>df$died new_df$born[sw] <- df$died[sw] new_df$died[sw] <- df$born[sw] new_df }