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