Funções Personalizadas
Lição 14 de 14 do curso Manipulação de Dados em R da Coddy.
Funções personalizadas em R são ferramentas poderosas para criar código reutilizável e realizar transformações de dados complexas. Elas permitem encapsular uma série de operações em uma única unidade chamável. Vamos explorar como criar e usar funções personalizadas para tarefas de manipulação de dados.
Estrutura Básica de uma Função Personalizada
A sintaxe básica para criar uma função personalizada em R é:
function_name <- function(arg1, arg2, ...) {
# Corpo da função
# Operações usando arg1, arg2, etc.
return(result)
}Criando uma Função Personalizada Simples
Vamos criar uma função simples que calcula a porcentagem de valores ausentes em um vetor:
percent_missing <- function(x) {
sum(is.na(x)) / length(x) * 100
}
# Uso
data <- c(1, 2, NA, 4, NA, 6)
percent_missing(data) # Retorna: 33.33333Funções com Múltiplos Argumentos
Funções personalizadas podem receber múltiplos argumentos, permitindo operações mais flexíveis:
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)
}
# Uso
df <- data.frame(x = 1:10, y = 11:20)
scaled_df <- scale_column(df, "x", 0, 100)Retornando Múltiplos Valores
Funções podem retornar múltiplos valores usando uma lista:
summarize_numeric <- function(x) {
list(
mean = mean(x, na.rm = TRUE),
median = median(x, na.rm = TRUE),
sd = sd(x, na.rm = TRUE)
)
}
# Uso
numbers <- c(1, 2, 3, 4, 5)
summary_stats <- summarize_numeric(numbers)Usando Funções Personalizadas com dplyr
Funções personalizadas podem ser particularmente úteis quando combinadas com o dplyr para manipulação de dados:
library(dplyr)
categorize_age <- function(age) {
case_when(
age < 18 ~ "Child",
age < 65 ~ "Adult",
TRUE ~ "Senior"
)
}
# Uso com dplyr
df <- data.frame(name = c("Alice", "Bob", "Charlie"), age = c(25, 72, 16))
df %>%
mutate(age_category = categorize_age(age))Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
MédioCrie uma função personalizada chamada mean_score que calcula a pontuação média de cada aluno em um conjunto de dados de pontuações de exames de estudantes.
Para calcular a pontuação média em cada linha, usaremos a função rowwise() e, posteriormente, usaremos ungroup() para retornar tudo ao estado original. Verifique o código fornecido.
Execute as seguintes ações:
- Crie uma nova coluna chamada
student_meanque contenha a pontuação média. - Crie uma nova coluna chamada
is_above_meanque contenha TRUE ou FALSE se o aluno estiver acima ou abaixo da média. - Crie uma coluna chamada
rankque contenha a posição de cada aluno em relação aos outros com base em sua média. Por exemplo, 1 significa que o aluno é o melhor, 2 significa que o aluno é o segundo melhor, etc.- Para encontrar a classificação, use
order():order(order(mean_col, decreasing = TRUE))
- Para encontrar a classificação, use
Experimente você mesmo
# Ler a entrada
con <- file("stdin", "r")
input_data <- readLines(con)
close(con)
# Processar os dados de entrada em um data frame
data <- read.csv(text = input_data, header = TRUE, stringsAsFactors = FALSE)
# Definir a função mean_score
mean_score <- function(data) {
# TODO: Escreva seu código aqui
# calcular a média de todas as matérias
return(result)
}
# TODOL Escreva seu código aqui
# Criar uma nova coluna chamada student_mean que contenha a pontuação média.
# Criar uma nova coluna chamada is_above_mean que contenha TRUE ou FALSE se o aluno estiver acima ou abaixo da média.
# Criar uma coluna chamada rank que contenha a posição de cada aluno em relação aos outros com base em sua média. Por exemplo, 1 significa que o aluno é o melhor, 2 significa que o aluno é o segundo melhor, etc.
# Imprimir o resultado
print(data)