Agrupando com split()
Parte da seção Lógica e Fluxo do Journey de R da Coddy. Lição 39 de 64.
split(values, groups) coloca cada valor no grupo nomeado pelo elemento correspondente de groups. O resultado é uma lista com um elemento por grupo, nomeada de acordo com os grupos em ordem crescente:
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
by_cat <- split(amounts, category)
print(names(by_cat))
print(by_cat[["food"]])Saída:
[1] "food" "fun" "rent"
[1] 10 30Combine split() com sapply() para calcular um resumo por grupo:
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
by_cat <- split(amounts, category)
print(sapply(by_cat, sum))
print(sapply(by_cat, length))Saída:
food fun rent
40 40 20
food fun rent
2 1 1 Os valores também podem ser textos, por exemplo, para agrupar nomes pela primeira letra:
names <- c("ana", "bo", "al", "bea", "cy")
groups <- split(names, substr(names, 1, 1))
for (letter in names(groups)) {
cat(letter, ":", paste(groups[[letter]], collapse = ", "), "\n")
}Saída:
a : ana, al
b : bo, bea
c : cy Um grupo só existe quando pelo menos um valor pertence a ele; portanto, verifique com %in% names() antes de ler um grupo que possa estar vazio:
by_cat <- split(c(5, 7), c("food", "food"))
print("rent" %in% names(by_cat))Saída:
[1] FALSEDesafio
FácilComplete category_totals(amounts, categories). Retorne uma linha por categoria em ordem alfabética, food: 40 (2 items), com o valor total e a quantidade de valores nessa categoria.
O código fornecido lê os valores e as categorias como duas linhas separadas por vírgulas, de mesmo tamanho, e imprime cada linha retornada.
Experimente você mesmo
category_totals <- function(amounts, categories) {
# Escreva seu código aqui
character(0)
}
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
cat(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), strsplit(input[2], ",")[[1]]), sep = "\n")
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings em Profundidade
Substrings com substr()Formatação com sprintf()Dividindo e UnindoPesquisando StringsSubstituindo TextoRecapitulação - Criador de Nome de Usuário4Matrizes
Criando MatrizesIndexando MatrizesResumos de Linhas e ColunasAritmética de MatrizesRecapitulação - Tabela de Assentos10Fluxo de Controle Avançado
A Função switch()ifelse() Vetorizadorepeat e breakFunções RecursivasRevisão — Classificador de Notas2Consultas de Chave-Valor
Consultas em Vetores NomeadosVerificando ChavesAdicionando e Removendo ChavesPercorrendo NomesRecapitulação - Mesa de Ações5Projeto - Boletim de Notas
Adicionando AlunosRegistrando Notas8Ordenação e Agrupamento
Ordenando VetoresOrdenando por uma ChaveAgrupando com split()Resumos de GruposRecapitulação - Tabela de Classificação3Conjuntos e Contagem
Valores ÚnicosOperações com ConjuntosTestes de PertinênciaContagem com table()Recapitulação - Convidados do Evento6Funções como Valores
Funções AnônimasPassando FunçõesRetornando FunçõesClosures com EstadoRecapitulação - Regras de Desconto9Data Frames
Criando Data FramesColunas e LinhasFiltrando LinhasAdicionando e OrdenandoRecapitulação - Relatório de Vendas12Projeto - Rastreador de Despesas
Registro de DespesasGastos TotaisPratique por conta própria: Compilador de R online