Cuidado ao converter fatores ( factors) para números ( numeric) !!! ( 3 min 4 seg)
Carregando arquivos: substituindo valores não existentes por NAs (2 min 23 seg)
Obs: valores não existentes representados por NULL , enquanto NA significa valor não disponível. Há várias funções para trabalhar com NA, veremos a seguir. Daí a vantagem em transformar valores não existentes em NA
Transformando os valores de uma coluna de um data frame ( de caracteres para fatores ) (2min 12 seg)
Usando a função gsub para substituir caracteres indesejados (8 min 07 seg)
Encontrando as linhas onde existem NAs ( função complete.cases) (2min 31 seg)
Usando a função "which" para selecionar dados (em data frames onde há NAs) ( 3 min 58 seg)
Explorando mais alguns exemplos do uso da função "which" ( 3 min 20 seg)
Removendo linhas onde aparecem NAs ( função "is.na()" ) (2 min 3 seg)
Organizando os nomes das linhas de um data-frame ( usando row.names(df) = NULL) (1 min 29 seg)
Substituindo um valor específico em um data frame ( usando is.na()) (2 min 22 seg)
Substituindo NAs pela média de valores da coluna (2 min 39 seg)
Substituindo NAs por valores calculados usando outras colunas (1 min 54 seg)
Observação: O código fonte para o nível Intermediário 1 e intermediário 2 é o mesmo (programa LimparDados.R . Os arquivos csv usados (Dados_Limpar, GASTOS,GASTOS_2021 e GASTOS_2022) encontram-se na pasta para dowload
# erro comum ao converter fatores!
anos= c("2010","2010","2010", "2011", "2011", "2012")
anos.factor = as.factor(anos)
str(anos.factor)
anos.num= as.numeric(anos.factor)
anos.num
# o erro ocorre pois R converte os numeros associados aos fatores
# para evitar o erro
anos.char= as.character(anos.factor)
anos.num2 = as.numeric(anos.char)
anos.num2
str(anos.num2)
df0= read.csv("Dados_Limpar.csv")
# substituindo todos os valores vazios "" por NA
df= read.csv("Dados_Limpar.csv", na.strings = c(""))
str(df)
head(df, 3)
df$Tipo = factor(df$Tipo)
str(df)
df$Estado = factor(df$Estado)
str(df)
# removendo os cifroes, virgulas, pontos e fazendo conversoes
df_backup= df
df$Receitas= gsub(",00","",df$Receitas)
df$Receitas
# ATENCAO, ISSO NAO FUNCIONA, PORQUE $ EH UM CARACTER ESPECIAL
df$Receitas= gsub("$","",df$Receitas)
df$Receitas
# TEM QUE INFORMAR O R QUE "$" EH UM CARACTERE ESPECIAL USANDO \\
df$Receitas= gsub("\\$","",df$Receitas)
df$Receitas
# Vamos nos livrar das virgulas e pontos. Note "." tambem eh caractere especial
df$Receitas= gsub("\\.","",df$Receitas)
df$Receitas
# trabalhando com as despesas, removendo "reais"
df$Despesas= gsub(" reais","",df$Despesas)
df$Despesas
# trabalhando com as despesas, removendo "."
df$Despesas= gsub("\\.","",df$Despesas)
df$Despesas
str(df)
#convertendo para valores numericos
df$Receitas= as.numeric(df$Receitas)
df$Despesas= as.numeric(df$Despesas)
str(df)
# NA = Not available or missing data
# para checar se ha NA em qualquer linha
df_backup = df
complete.cases(df)
# criando um subconjunto apenas com as linhas onde tem NAs
df_novo = df[!complete.cases(df),]
# Entendendo NA
a= 1
a == 1
a == 2
a= NA
a == 1
a == 2
a == NA
# Nota: R faz a distincao entre vazio "" e NA!
# Selecionando linhas usando "witch"
# Quando nao tem NA, funciona corretamente
FG = df[df$Nome == "Faculdade G",]
FG
# Lembrando que NA eh um operador logico
despesa.150000 = df[df$Despesas == 150000,]
despesa.150000
# Apareceram varios NAs, a razao eh que
# TRUE == NA -> NA
# FALSE == NA-> NA
# por isso aparecem linhas o valor da coluna == NA
# Resolve esse problema usando "which"
despesa.150000 = df[which(df$Despesas == 150000),]
despesa.150000
# Mais exemplos de uso da funcao which
# separando as faculdades de medicina
f.medicina = df[which(df$Tipo =="Medicina"),]
f.medicina
# compare com o comando abaixo, onde aparecem as linhas com NAs
f.medicina2 = df[df$Tipo =="Medicina",]
f.medicina2
# usando com condicionais
receita.maior.300000 = df[which(df$Receitas > 300000),]
receita.maior.300000
# nunca compare nada com NA pois o resultado eh NA
despesas.na = df[df$Despesas == NA,]
despesas.na
# usar a funcao is.na
df= df_backup
tipo.na= df[is.na(df$Tipo),]
tipo.na
# Vamos remover linhas em que aparece NA
# Vamos remover as faculdades onde nao ha informacao sobre o tipo
df2 = df[!is.na(df$Tipo),]
# Corrigindo os row names do data frame ()
# removemos duas faculdades, precisamos arrumar os indices
row.names(df2)= NULL
df2
# Vamos agora substituir uma celula onde aparece NA por um valor
# no nosso exemplo, queremos inserir o ano de criacao da faculdade D
# digamos que o ano eh 2017
df.backup = df
# note que estou acessando pelo nome da coluna!
df[is.na(df$Criacao) & df$Nome == "Faculdade D", "Criacao"] = 2017
# equivale a
df= df.backup
df[4,3]= 2017
# equivale a
df= df.backup
df[df$Nome == "Faculdade D","Criacao"]= 2017
# substituindo um valor pela media
#vamos substituir os valores das Despesas onde tem NA pela media
# primeiro vamos calcular a media
media= mean(df$Despesas, na.rm =T)
media= round(media,0)
# em todas as linhas onde Despesas = NA, substituo pela media
df[is.na(df$Despesas),"Despesas"]= media
# substituindo um valor pela mediana
#vamos substituir os valores das Receitas onde tem NA pela mediana
# primeiro vamos calcular a mediana
mediana= median(df$Receitas, na.rm =T)
mediana
df[is.na(df$Receitas),"Receitas"]= mediana
df.backup =df
str(df)
# Recalculando tudo, substituindo os valores dos Lucros onde tem NA
df$Lucro = df$Receitas- df$Despesas
df= df.backup
# Substituindo apenas as linhas onde Lucros tem NA
# note que eu repito as linhas onde Lucro tem NA
df[is.na(df$Lucro),"Lucro"]= df[is.na(df$Lucro),"Receitas"]- df[is.na(df$Lucro),"Despesas"]
# Funcao Apply
l1=c(2,4,6)
l2=c(4,2,6)
M= rbind(l1,l2)
is.matrix(M)
M
# Aplicando a funcao media (mean) a uma matriz
# o retorno eh um vetor
# Aplicando para as linhas
media.linhas = apply(M,1,mean)
media.linhas
# Aplicando para as colunas
media.colunas = apply(M,2,mean)
media.colunas
# transformando os dados da primeira coluna em nomes das linhas
df= read.csv("GASTOS.csv")
df= read.csv("GASTOS.csv", row.names = 1)
ma = as.matrix(df)
is.matrix(ma)
ma
# quais a medias de gastos por tipo de despesa?
medias.tipo= apply(ma,1,mean)
medias.tipo = round(medias.tipo,0)
medias.tipo
# quais a medias de gastos mensais?
medias.mensais= apply(ma,2,mean)
medias.mensais = round(medias.mensais,0)
medias.mensais
# quais foram os maiores gastos por tipo de despesa?
max.tipo= apply(ma,1,max)
max.tipo = round(max.tipo,0)
max.tipo
# funcao lapply
# aplica-se a listas (list)
#vamos criar uma lista, com gastos de 2021 e 2022
df1= read.csv("GASTOS_2021.csv", row.names = 1)
despesas_2021= as.matrix(df1)
df2= read.csv("GASTOS_2022.csv", row.names = 1)
despesas_2022= as.matrix(df2)
despesas = list(ANO_2021= despesas_2021,ANO_2022= despesas_2022)
str(despesas)
View(despesas)
despesas
# usando a funcao lappy
despesas
lapply(despesas,rowMeans)
# checando
mean(c(1850, 1900, 1720, 1650, 1699, 1650, 1800, 1700, 1930, 2590, 1599, 1900))
# checando
lapply(despesas,colMeans)
mean(c(1850,50,200,100,200))
# usandl lappy em conjunto com []
despesas
# RELEMBRANDO:acessando os valores de uma lista
despesas[[1]][1,1]
despesas$ANO_2021["SUPERMERCADO","JAN"]
despesas[["ANO_2021"]]["SUPERMERCADO","JAN"]
despesas$ANO_2021[1,1]
despesas
# ACESSANDO UMA LINHA
despesas[[2]][1,]
# ACESSANDO UMA COLUNA
despesas[[2]][,1]
despesas[["ANO_2022"]][,"JAN"]
# USANDO LAPPY PARA ACESSAR VALORES DE LISTAS
# um elemento das 2 listas
lapply(despesas,"[",1,1)
# uma linha das 2 listas
lapply(despesas,"[",1,)
despesas
# uma coluna das 2 listas
lapply(despesas,"[",,1)
# APLICANDO UMA FUNÇÃO CRIADA POR VOCE
lapply(despesas,function(x) x[1,]/1000)
despesas
lapply(despesas,function(x) max(x[1,]))
lapply(despesas,function(x) max(x[,1]))
despesas
lapply(despesas,function(y) y[1,]+y[2,])
# sapply eh uma versao mais user friendly de lapply
# dependendo da informacao, retorna UM VETOR ou uma LISTA
# Nota: lapply sempre retorna lista
# um elemento das 2 listas
despesas
lapply(despesas,"[",1,1)
sapply(despesas,"[",1,1)
despesas
lapply(despesas,"[",1,)
sapply(despesas,"[",1,)
despesas
lapply(despesas,"[",1,1:3)
sapply(despesas,"[",1,1:3)
despesas
lapply(despesas,rowMeans)
sapply(despesas,rowMeans)
# usando lapply junto com apply
despesas_2021
str(despesas_2021)
apply(despesas_2021,1,max)
despesas
lapply(despesas, apply,1,max)
sapply(despesas, apply,1,max)
# segundo exemplo
despesas_2021
apply(despesas_2021,1,mean)
despesas
lapply(despesas, apply,1,mean)
sapply(despesas, apply,1,mean)
# terceiro exemplo
despesas_2021
apply(despesas_2021,2,mean)
despesas
lapply(despesas, apply,2,mean)
sapply(despesas, apply,2,mean)
# which.max: da´ o indice do vetor onde eh o maximo valor
despesas_2021
indice =which.max(despesas_2021[2,])
indice
nome = names(which.max(despesas_2021[2,]))
nome
# usando which.max com apply
despesas_2021
apply(despesas_2021,1,function(x) which.max(x))
apply(despesas_2021,1,function(x) names(which.max(x)))
# usando which.min com apply
despesas_2021
apply(despesas_2021,1,function(x) which.min(x))
apply(despesas_2021,1,function(x) names(which.min(x)))
# aplicando em uma lista, com lapply
lapply(despesas,function(y) apply(y,1,function(x) names(which.max(x))))
despesas
sapply(despesas,function(y) apply(y,1,function(x) names(which.max(x))))
# segundo exemplo: aplicando em uma lista, com lapply
lapply(despesas,function(y) apply(y,2,function(x) names(which.min(x))))
despesas
sapply(despesas,function(y) apply(y,2,function(x) names(which.min(x))))
despesas
# Notas: usando lapply para listas de caracteres
?lapply
# lapply returns a list of the same length as X, each element
# of which is the result of applying FUN to the corresponding element of X.
# podemos usar apply para um vetor de caracteres
nomes = c("joao","erica","gigio","cookie")
typeof(nomes)
str(nomes)
class(nomes)
nomes_maiusculo1 = lapply(nomes,toupper)
nomes_maiusculo1
nomes_maiusculo2 = lapply(nomes,function(x) toupper(x))
nomes_maiusculo2
maiuscula = function(x){
return(toupper(x))
}
nomes_maiusculo3 = lapply(nomes,maiuscula)
nomes_maiusculo3
nomes_maiusculo4 = sapply(nomes,toupper)
nomes_maiusculo4
# usando lapply para uma lista
l1 = c("joao","erica","gigio","cookie")
l2 =c("marcelo","karina","kenzo","tutu")
lista = list(l1,l2)
nomes_maiusculo5 = lapply(lista,toupper)
nomes_maiusculo5
# usando lapply para uma matriz
l1 = c("joao","erica","gigio","cookie")
l2 =c("marcelo","karina","kenzo","tutu")
m= rbind(l1,l2)
str(m)
typeof(m)
is.matrix(m)
nomes_maiusculo6 = lapply(m,toupper)
nomes_maiusculo6
# equivale a
nomes_maiusculo7 = lapply(m,function(x) toupper(x))
nomes_maiusculo7
# usando apply
linhas.maiusculas = apply(m,1,toupper)
# usando lapply para um daframe
l1 = c("joao","erica","gigio","cookie")
l2 =c("marcelo","karina","kenzo","tutu")
m= rbind(l1,l2)
df= data.frame(m)
str(df)
typeof(df)
is.data.frame(df)
is.list(df)
nomes_maiusculo8 = lapply(df,toupper)
nomes_maiusculo8