Menu
Coddy logo textTech

Funkcje niestandardowe

Lekcja 14 z 14 w kursie Manipulowanie danymi w R w Coddy.

Własne funkcje w R to potężne narzędzia, które pozwalają tworzyć kod wielokrotnego użytku i wykonywać złożone przekształcenia danych. Umożliwiają zamknięcie serii operacji w jednej jednostce, którą można wywołać. Zobaczmy, jak tworzyć i używać własnych funkcji do zadań związanych z przetwarzaniem danych.

Podstawowa struktura własnej funkcji

Podstawowa składnia tworzenia własnej funkcji w R wygląda następująco:

function_name <- function(arg1, arg2, ...) {
  # Ciało funkcji
  # Operacje z użyciem arg1, arg2 itd.
  return(result)
}

Tworzenie prostej własnej funkcji

Utwórzmy prostą funkcję, która oblicza procent brakujących wartości w wektorze:

percent_missing <- function(x) {
  sum(is.na(x)) / length(x) * 100
}

# Użycie
data <- c(1, 2, NA, 4, NA, 6)
percent_missing(data)  # Zwraca: 33.33333

Funkcje z wieloma argumentami

Własne funkcje mogą przyjmować wiele argumentów, co pozwala na bardziej elastyczne operacje:

scale_column <- function(df, column_name, min_val = 0, max_val = 1) {
  df[[column_name]] <- (df[[column_name]] - min(df[[column_name]], na.rm = TRUE)) / 
                       (max(df[[column_name]], na.rm = TRUE) - min(df[[column_name]], na.rm = TRUE))
  df[[column_name]] <- df[[column_name]] * (max_val - min_val) + min_val
  return(df)
}

# Użycie
df <- data.frame(x = 1:10, y = 11:20)
scaled_df <- scale_column(df, "x", 0, 100)

Zwracanie wielu wartości

Funkcje mogą zwracać wiele wartości za pomocą listy:

summarize_numeric <- function(x) {
  list(
    mean = mean(x, na.rm = TRUE),
    median = median(x, na.rm = TRUE),
    sd = sd(x, na.rm = TRUE)
  )
}

# Użycie
numbers <- c(1, 2, 3, 4, 5)
summary_stats <- summarize_numeric(numbers)

Używanie własnych funkcji z dplyr

Własne funkcje mogą być szczególnie przydatne w połączeniu z dplyr do przetwarzania danych:

library(dplyr)

categorize_age <- function(age) {
  case_when(
    age < 18 ~ "Child",
    age < 65 ~ "Adult",
    TRUE ~ "Senior"
  )
}

# Użycie z dplyr
df <- data.frame(name = c("Alice", "Bob", "Charlie"), age = c(25, 72, 16))
df %>%
  mutate(age_category = categorize_age(age))
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

challenge icon

Wyzwanie

Średni

Utwórz niestandardową funkcję o nazwie mean_score, która oblicza średni wynik każdego ucznia na podstawie zbioru danych z wynikami egzaminów uczniów.

Aby obliczyć średni wynik w każdym wierszu, użyjemy funkcji rowwise(), a następnie użyjemy ungroup(), aby przywrócić wszystko do poprzedniego stanu. Sprawdź podany kod.

Wykonaj następujące czynności:

  1. Utwórz nową kolumnę o nazwie student_mean, która będzie zawierać średni wynik.
  2. Utwórz nową kolumnę o nazwie is_above_mean, która będzie zawierać TRUE lub FALSE, informując, czy wynik ucznia jest powyżej, czy poniżej średniej.
  3. Utwórz kolumnę o nazwie rank, która będzie zawierać miejsce każdego ucznia względem pozostałych na podstawie jego średniego wyniku. Na przykład 1 oznacza, że uczeń ma najlepszy wynik, 2 oznacza, że uczeń ma drugi najlepszy wynik itd.
    • Aby znaleźć miejsce w rankingu, użyj order(): order(order(mean_col, decreasing = TRUE))

Spróbuj swoich sił

# Wczytaj dane wejściowe
con <- file("stdin", "r")
input_data <- readLines(con)
close(con)

# Przekształć dane wejściowe w ramkę danych
data <- read.csv(text = input_data, header = TRUE, stringsAsFactors = FALSE)

# Zdefiniuj funkcję mean_score
mean_score <- function(data) {
  # TODO: Napisz tutaj swój kod
  # oblicz średnią ze wszystkich przedmiotów

  return(result)
}

# TODOL Napisz tutaj swój kod
# Utwórz nową kolumnę o nazwie student_mean, zawierającą średni wynik.
# Utwórz nową kolumnę o nazwie is_above_mean, zawierającą TRUE lub FALSE w zależności od tego, czy wynik ucznia jest powyżej czy poniżej średniej.
# Utwórz kolumnę o nazwie rank, zawierającą pozycję każdego ucznia względem pozostałych na podstawie ich średnich wyników. Na przykład 1 oznacza ucznia z najlepszym wynikiem, 2 oznacza ucznia z drugim najlepszym wynikiem itd.

# Wyświetl wynik
print(data)

Wszystkie lekcje w sekcji Manipulowanie danymi w R

Poćwicz samodzielnie: Kompilator R online