We are hiring ! See our job offers.
https://github.com/tom-n-walker/uphill-plants-soil-carbon
Raw File
Tip revision: a9e7a872d22a45dbd91bb00751d522812138eefd authored by Tom Walker on 08 February 2022, 15:18:56 UTC
Additional and revised analysis in response to author comments.
Tip revision: a9e7a87
small_functions.R
################################################################################
#### Project: Lowland plant migrations alpine soil C loss
#### Title:   Small functions
#### Author:  Tom Walker (thomas.walker@usys.ethz.ch)
#### Date:    26 May 2021
#### ---------------------------------------------------------------------------

# calculate CWMs for trait data
add_cwm_traits <- function(.x, .y){
  # apply a weighted average to each  bin
  cwm_list <- lapply(.y, function(y){
    match_trait <- match(colnames(.x), colnames(y))
    trait_value <- y[, match_trait] %>% as.matrix %>% as.vector
    cwm_trait <- .x %>%
      apply(1, function(.x){weighted.mean(w = .x, x = trait_value)})
    return(cwm_trait)
  })
  # bind into data frame
  cwm_bound <- do.call(cbind, cwm_list) %>% as.data.frame %>% as_tibble
  # return
  return(cwm_bound)
}

# calculate biomass from cover data
biomass <- function(x, y){
  # index for bare ground
  bare_index <- colnames(x) %in% "bare.ground"
  # select vegetation types
  bio_out <- data.frame(vege_bio = x[, !bare_index] %>% rowSums,
                        focal_bio = rowSums(y)) %>%
    as_tibble %>%
    mutate(bkgnd_bio = vege_bio - focal_bio)
  # return
  return(bio_out)
}

# format treatment information from collar data to grid-id
join_treats <- function(.x, .y){
  out <- left_join(.x, .y) %>%
    # format treatments correctly
    mutate(elevation = substr(marc_treatment, 1, 1),
           block = paste0(elevation, num_in_string(marc_treatment)),
           treatment = substr(marc_treatment, nchar(marc_treatment), nchar(marc_treatment))) %>%
    # add leading zero to block
    mutate(block = ifelse(
      nchar(block) == 3,
      block,
      paste0(substr(block, 1, 1), "0", substr(block, 2, 2))
    )) %>%
    # select columns
    select(grid_id, elevation:treatment)
  return(out)
}

# match soil data rows to plant data treatments
match_soil <- function(.x, .y, match){
  # matching variables
  match_by <- c("elevation","block", "treatment")
  names(match_by) <- c("elevation", "block", match)
  # join data and return
  out <- left_join(.x, .y, by = match_by) %>%
    select(Soil.temp:CUE)
  return(out)
}

# get number from string
num_in_string <- function(x){
  out <- str_extract_all(x, "[:digit:]", simplify = T) %>%
    apply(1, paste0, collapse = "")
  return(out)
}

#  take DF, calculate relative abundance, transpose, make DF
ra_t_df <- function(x){
  out <- x %>%
    apply(1, function(x) x/sum(x, na.rm = T)) %>%
    t
  out[is.na(out)] <- 0
  out <- as_tibble(out)
  return(out)
}

# subset focal data set by site-presences
select_focals <- function(focals, site){
  tf <- focals[, site] == "Y"
  out <- focals %>% filter(tf) %>%
    transmute(accepted_name = make.names(accepted_name))
  return(out)
}


# subset, make column names, spread ----
sub_col_spread <- function(traits, subset){
  # select subset
  now <- traits[, c("accepted_name", subset)]
  colnames(now) <- c("accepted_name", "value")
  out <- now %>%
    pivot_wider(names_from = accepted_name, values_from = value)
  return(out)
}

# subset cover data for background plants only
subset_bckgnd <- function(.x, .y){
  match_focals <- colnames(.x) %in% .y$accepted_name
  out <- .x[, !match_focals]
  return(out)
}

# subset cover data for focals only 
subset_focals <- function(.x, .y){
  match_focals <- colnames(.x) %in% .y$accepted_name
  out <- .x[, match_focals]
  return(out)
}
back to top