# definizione funzione mediana_dispari
# [caso di vettore in input dispari]


# testata della funzione
mediana_dispari <- function(x){

#  print("---- Contenuto oggetto x ---")
#  print(x)
  
  # ordino il vettore
  x_ord <- sort(x)
  # posizione della mediana con n dispari (n + 1)/2
  n <- length(x)
  pos_med <- (n + 1) / 2
  med <- x_ord[pos_med]
  
  # output funzione
  # (ultima espressione non assegnata oppure sfruttando return)
  return(med)
  
}

mediana_dispari(c(1, 2, 30, 4, 5))
median(c(1, 2, 30, 4, 5))

mode(mediana_dispari)
mediana_dispari

mediana_dispari(c(1, 2, 5, 4, 3))
mediana_dispari(x = c(1, 2, 5, 4, 3))

out <- mediana_dispari(c(1, 2, 5, 4, 3))

# vettore di lunghezza dispari
x <- c(10, 30, 3, 5, 20, 30, 100, 18, 15)

mediana_dispari(x)
mediana_dispari(x = x)

mediana_dispari(c(1, 2, 5, 4, 3))
mediana_dispari(x = c(1, 2, 5, 4, 3))


mediana_dispari_bis <- function(x)
  sort(x)[(length(x) + 1)/2]

mediana_dispari_bis(c(1, 2, 30, 4, 5))  

mediana_home <- function(x){

    # calcola la lunghezza del vettore
  n <- length(x)
  # ordino il vettore
  x_ord <- sort(x)
  
  # calcolo la mediana
  if((n %% 2) != 0){
    # se n è dispari: il valore alla pos. (n + 1) / 2
    out <- x_ord[(n + 1) / 2]
  }
  else{
    # se n è pari: 
    #   la media dei valori alle pos. n/2 e alla pos. successiva
    out <- (x_ord[n / 2] + x_ord[(n / 2 + 1)]) / 2
  }
  
  # restituisco in output la mediana
  return(out)    
}


mediana_home(c(10, 2, 30, 4, 50, 6, NA))

library(tidyverse)
iris |> 
  select(where(is.numeric)) |> 
  summarise(across(everything(), .fns = mediana_home))




