loop For, R - Include function in For and save result to object

Asked

Viewed 847 times

1

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 within for and each result save as a data-frame line?

How do I include in the for that reads the files in 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 line is the result vector of the function I created.

  • Why the tag rstudio? This tag should only be used if the question is about something that only happens in Rstudio.

  • Is twice soma_20_max, maybe the second time is soma_50_max?

1 answer

3


You can do what you want with two applications of lapply, the best way to do it.
With the cycle for and assign, gets several dataframes in .GlobalEnv, with lapply keeps a list that keeps them all in one place. It is best to leave the .GlobalEnv well arranged and besides it is much easier to process them after.

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)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.