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.33333Funkcje 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))Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wyzwanie
ŚredniUtwó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:
- Utwórz nową kolumnę o nazwie
student_mean, która będzie zawierać średni wynik. - 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. - 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))
- Aby znaleźć miejsce w rankingu, użyj
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
1Podstawy danych
Poznawanie struktur danychIndeksowanie w DataFrameWybieranie podzbioru danychKonwersja typów danychOperator potoku w R4Zaawansowana manipulacja danymi
Manipulowanie ciągami znakówObsługa daty i czasuFunkcje niestandardowe2Przekształcanie danych
Wprowadzenie do dplyrAgregowanie danych za pomocą dplyrŁączenie danych za pomocą dplyrPoćwicz samodzielnie: Kompilator R online