loop For, R - include function in For and save result in an object

install.packages("xlsx")
install.packages("stringr")
library(xlsx)   #pacote para ler os arquivos do excel
library(stringr)
library(e1071)  #pacote para calcular a curotse e o skewness


#Função que realiza calculos que preciso
calculos <- function(empresa){

  # calculando o retorno
  retorno <- diff(log(empresa[,5])) 
  #calculando media do retorno
  media_retorno <- mean(retorno)
  #calculando o risco
  desvio_retorno <- sd(retorno)

  #os 10 menores valores
  minimo <- sort(retorno, decreasing = FALSE)
  #os 10 maiores valores
  maximo <- sort(retorno, decreasing = TRUE)

  #somando os 10 maiores valores
  soma_10_max <- sum(maximo[1:10])
  #somando os 10 menores valores
  soma_10_min <- sum(minimo[1:10])

  #somando os 20 maiores valores
  soma_20_max <- sum(maximo[1:20])
  #somando os 20 menores valores
  soma_20_min <- sum(minimo[1:20])

  #somando os 50 maiores valores
  soma_50_max <- sum(maximo[1:50])
  #somando os 50 menores valores
  soma_50_min <- sum(minimo[1:50])

  #Calculando a curtorse com o pacote e1071
  curtose <- kurtosis(retorno, type = 1)
  #Calculando o Skewness com o pacote e1071
  skewness <- skewness(retorno, type=1)
  #Calculando o shapiro
  shapiro <- shapiro.test(retorno)


  distancia_10_max <- (mean(maximo[1:10]) - mean(retorno))/sd(retorno)
  distancia_10_min <- (mean(minimo[1:10]) - mean(retorno))/sd(retorno)

  distancia_20_max <- (mean(maximo[1:20]) - mean(retorno))/sd(retorno)
  distancia_20_min <- (mean(minimo[1:20]) - mean(retorno))/sd(retorno)

  distancia_50_max <- (mean(maximo[1:50]) - mean(retorno))/sd(retorno)
  distancia_50_min <- (mean(minimo[1:50]) - mean(retorno))/sd(retorno)


  #Cria um vetor com todos os resultados dos calculos que realizamos.
  result_calculos <- c(media_retorno, desvio_retorno, soma_10_max,
                       soma_20_max, soma_50_max, soma_10_min, soma_20_min, 
                       soma_50_min, curtose, skewness, shapiro, 
                       distancia_10_max,
                       distancia_20_max, distancia_50_max, distancia_10_min, 
                       distancia_20_min, distancia_50_min)
  print(result_calculos)  #exibe os resultados. 
}



#Lista todos os arquivos de uma pasta
nome_arquivo <- list.files() 

# lendo os arquivos que estão na pasta, i é a posição do nome do arquivo
for(i in 1:length(nome_arquivo)){
  tmp <- read.xlsx(nome_arquivo[i], sheetIndex =1,startRow=4)
  nome <- substr(nome_arquivo[i],1,nchar(nome_arquivo[i])-5)
  assign(nome, tmp)
  rm(nome)
  rm(tmp)
}

How to use a function inside the for and save each result as a row of a data-frame?

How can I include in the for that reads the files from the folder the function I created that performs the calculations I need? The results of these calculations should be saved in a data-frame where each row is the result vector of the function I created.

 1
Author: Vítor Salgado, 2019-06-22

1 answers

You can do what you want with two applications of lapply, the best way to do it.
With the loop for and assign, you get multiple dataframes in .GlobalEnv, with lapply you get a list that keeps them all in the same place. It is best practice to leave the .GlobalEnv well tidy and besides it is much easier to process them later.

nome_arquivo <- list.files() 

ler <- lapply(nome_arquivo, function(arq){
  tmp <- tryCatch(read.xlsx(arq, sheetIndex = 1, startRow = 4),
                  error = function(e) e)
  nome <- substr(arq, 1, nchar(arq) - 5)
  list(nome = nome, dados = tmp)
})

ok <- sapply(ler, function(L) !inherits(L[["dados"]], "error"))
lista_erros <- lapply(ler[!ok], `[[`, "nome")
lista_dados <- lapply(ler[ok], `[[`, "dados")
names(lista_dados) <- sapply(ler[ok], `[[`, "nome")

lista_result <- lapply(lista_dados, calculos)
 3
Author: Rui Barradas, 2019-06-22 16:45:50