[[bot89:precurso:1applyloops:inicio]]

Funções da família apply()

Algumas funções da família apply são muito úteis na manipulação de dados e descrição de dados. Essas funções são muito poderosas, porque permitem você fazer iterações de forma simples, ou seja, você pode aplicar uma função a vários objetos simultaneamente com funções dessa família. O que você faz com essas funções você também faz com as construções de fluxo (e.g.FOR(){}), mas essas funções simplificam e aceleram o processo.

  • apply() - poderia ser traduzido como aplica uma função (FUN) a todas as linhas ou colunas (MARGIN) de uma matriz (X):
?apply #Veja o help
#os argumentos dessa função são:
#X = matrix 
#MAGRIN = 1 indica linha, 2 indica colunas
#FUN = a função que você deseja aplicar
#... ARGUMENTOS DESSA FUNCAO SE FOR O CASO
 
#TOTAIS MARGINAIS
#crie uma matriz
X = matrix(1:36,nrow=4,ncol=9)
colnames(X) = paste('col',1:ncol(X))
rownames(X) = paste('ln',1:nrow(X))
head(X) #cabeça da matriz criada
 
#calcule para todas as linhas:
#a soma dos valores
apply(X,MARGIN=1,FUN=sum)
#o valor máximo
apply(X,MARGIN=1,FUN=max)
#a média
apply(X,MARGIN=1,FUN=mean)
#o desvio padrão
apply(X,MARGIN=1,FUN=sd)
 
#para todas as colunas
#a soma dos valores
apply(X,MARGIN=2,FUN=sum)
#o valor máximo
apply(X,MARGIN=2,FUN=max)
#a média
apply(X,MARGIN=2,FUN=mean)
#o desvio padrão
apply(X,MARGIN=2,FUN=sd)
  • rowSums() ou rowMeans() & colSums() ou colMeans() - funções equivalentes a apply() (elas usam apply) que simplificam o uso para somas e médias de linhas e colunas. Se você conhece bem a função apply() pode fazer o que essas funções fazem e muito mais. Portanto, sabendo apply() não precisa se preocupar com essas funções mais específicas.
?rowSums
rowSums(X) #soma de cada linha
rowMeans(X) #media de cada linha
colSums(X) #soma de cada coluna
colMeans(X) #média de cada coluna
  • Usando controladores de fluxo para fazer soma e média: - fazendo na unha a mesma coisa que pode fazer com apply
somas = NULL #objeto vazio para salvar soma de cada linha
medias = NULL #objeto vazio para salvar medias de cada linha
for(i in 1:nrow(X)) { #para cada linha
  somai = sum(X[i,])  #soma dos valores na linha i
  somas = c(somas,somai) #junta a somai com o resto (que estará vazio na primeira vez)
  mediai = mean(X[i,]) #média  dos valores na linha i
  medias = c(medias,mediai) #junta as medias
}
#como a matriz tem nomes, acrescenta esses nomes aos vetores com resultados
names(medias) = rownames(X)
medias
names(somas) = rownames(X)
somas
  • lapply() - para uma lista ou vetor, aplica uma função FUN para cada elemento do vetor ou lista. Retorna um objeto de classe list.
#muito simples, imprime algo linha por linha
ll = lapply(LETTERS,print)
class(ll)
str(ll)
 
#suponha três vetores de tamanhos diferentes
v1=sample(1:1000,50)
length(v1)
v2= sample(1:100,30)
length(v2)
v3= sample(1000:2000,90)
length(v3)
#imagina que isso esteja numa lista
ml = list(v1,v2,v3)
class(ml)
length(ml)
 
#posso usar lapply para calcular a media desses vetores
lapply(ml,mean) #note que retorna uma lista
lt = lapply(ml,mean) #podemos guardar
lt = as.vector(lt, mode='numeric') #e transformar num vetor. MODE neste caso é fundamental usar
lt
  • tapply() - aplica uma função numa coluna numérica individualizando para cada categoria de um fator.
#vamos usar os dados de Iris novamente
?iris
#calculando o comprimento médio de sepálas pelas categorias de um fator (especies)
class(iris$Sepal.Length) #variavel numerica
class(iris$Species) #fator com categorias que correspondem a especies
tapply(iris$Sepal.Length,iris$Species,FUN=mean)
 
#calculando o comprimento máximo por especie
tapply(iris$Sepal.Length,iris$Species,FUN=max)
 
#a amplitude de variacao
tapply(iris$Sepal.Length,iris$Species,FUN=range)
 
#note que essa funcao sempre retorna um array (que é uma lista de fato, neste caso)
tm = tapply(iris$Sepal.Length,iris$Species,FUN=min)
class(tm)
names(tm)
tm[['setosa']] #indexadores de lista
 
tr = tapply(iris$Sepal.Length,iris$Species,FUN=range)
class(tr)
names(tr)
tr[['setosa']]

  • bot89/precurso/1applyloops/inicio.txt
  • Última modificação: 15/32/2020 15:32
  • por perdiz