2017-10-16 1 views
1

좋아, 내가 파일의 디렉토리가 있다고 말하면 각각의 모든 파일에 대해 동일한 명령을 실행하고 싶다. 아래 내 디렉토리에 10 개 파일은 여기에 있지만 데이터 프레임의 목록으로 표현하는 것, 예를 들어 있습니다 :오류 후 처리를 계속하는 루프

# Create dummy files 
    file1 <- as.data.frame(runif(100, 0,100)) 
    file2 <- as.data.frame(runif(100, 0,100)) 
    file3 <- as.data.frame(runif(100, 0,100)) 
    file4 <- as.data.frame(runif(12, 0,100)) 
    file5 <- as.data.frame(runif(100, 0,100)) 
    file6 <- as.data.frame(runif(15, 0,100)) 
    file7 <- as.data.frame(runif(100, 0,100)) 
    file8 <- as.data.frame(runif(8, 0,100)) # This is the df that its intended to fail on 
    file9 <- as.data.frame(runif(100, 0,100)) 
    file10 <- as.data.frame(runif(100, 0,100)) 
    file11 <- as.data.frame(runif(100, 0,100)) 

    # Lets pretend the files are .csv files on my HDD 
    # But here will make a list of data frames 
    file.list <- list(file1,file2,file3,file4,file5,file6,file7,file8,file9,file10) 

# Rename column names for all 10 df 
Names <- function(x) { 
    names(x) <- c("Close") 
    return(x) 
} 
# Apply name change to all 10 data frames 
file.list <- lapply(file.list, Names) 

좋아, 그래서 지금 우리는 내가 통해 반복 할 때의 데이터가 각 파일에 내가 소원 2 ~ 12 단순 이동 평균을 계산합니다.

첫 번째는 file.list [[i]] (또는 데이터 프레임 1)에서 시작하는 함수에서 단순 이동 평균 프로 시저를 래핑합니다. 내 진짜 문제는 이것들이 내 디렉토리의 파일이지만, 예를 들어 똑같은 것이다.

# Create function for performing commands. 
    genSMA = function(x){ 
     nextfile <- data.frame(file.list[[i]],stringsAsFactors=FALSE) 
     new.df <- data.frame(nextfile) 
     # Load packages 
     require(TTR) 
     # Use TTR package to create rolling SMA n day moving average 
     getSMA <- function(numdays) { 
     function(new.df) { 
      SMA(new.df[,"Close"], numdays) # Calls TTR package to create SMA 
     } 
     } 
     # Create a matrix to put the SMAs in 
     sma.matrix <- matrix(nrow=nrow(new.df), ncol=0) 
     tail(sma.matrix) 
     # Loop for filling it 
     for (i in 2:12) { 
     sma.matrix <- cbind(sma.matrix, getSMA(i)(new.df)) 
     } 

     # Rename columns 
     colnames(sma.matrix) <- sapply(2:12, function(n)paste("close.sma.n", n, sep="")) 

     # Bind to existing dataframe 
     new.df <- cbind(new.df, sma.matrix) 

    } 

는 지금은 모든 데이터 프레임을 통해이 기능을 실행하는 for 루프를 호출

for (i in 1:length(file.list)){ 
    genSMA(file.list[[i]]) 
} 

확인이 그것이 실패하기 위해서는 설정입니다. 그것은 데이터 프레임 (8)에 실패하고이 오류 메시지를 출력한다 : SMA 9,10,11,12-의 단순 이동 평균을 계산하기에 충분한 데이터가 없기 때문에

Error in runSum(x, n) : n = 9 is outside valid range: [1, 8] 

이입니다. 이들을 계산하기 위해서는 9,10,11,12 데이터 포인트보다 긴 데이터가 필요합니다.

내 질문은 :

내가 나머지 파일을 통해 루프를 계속 오류 메시지를 무시하고이 코드에 뭔가를 추가하려면 어떻게?

또한 출력을 하나의 데이터 프레임에 저장하는 방법을 모르십니까? 당신은 이것이 실행되고 아무 것도 출력하지 않을 것임을 알게 될 것입니다. 최종 결과를 데이터 프레임에도 저장하는 것이 좋습니다.

그러나, 위의 코드를 실행하고 R에 tryCatch 블록을 사용할 수 있습니다 8. ​​

답변

1

파일에 오류 메시지를 보여주는 그림을 위해 않습니다

tryCatch 외에도
for (i in 1:length(file.list)){ 
    tryCatch({ 
     genSMA(file.list[[i]]) 
    }, error = function(e) { print(paste("i =", i, "failed:")) }) 
} 
+0

확인 반복에서 어떤 반복이 실패했는지 알려주고, 나머지 파일도 계속 순환 할 것인가? –

+0

예, 테스트하지 않으시겠습니까? –

+0

예 대답입니다 - 위의 예에서 프로세스가 완료된 후 볼 수 있도록 데이터 프레임에 출력을 저장하는 절차가 있습니까? –

2

, 하나 개의 옵션 R에서 foreach 패키지를 고려해야합니다. 제가 제안한 이유는 for 루프를 사용하여 sma.matrix을 빌드했기 때문입니다. R이 각 루프에서 메모리를 다시 할당해야하기 때문에 매우 느리게 될 수 있으므로이 방법으로 객체를 작성하는 것은 좋지 않습니다. 많은 사람들이이를 위해 apply 기능 중 하나를 사용하거나, 사전에 빈 행렬을 할당 제안,하지만 난 사용하기 foreach 패키지 쉽게 찾는 경향도 아주 능숙하게 오류의 문제를 처리합니다 그

library(foreach) 

sma.matrix <- foreach(
    i = 1:12,  # This is your for loop iterator 
    .combine=cbind, # Specify how to combine the results of each loop 
    .errorhandling="remove" # When error occurs, skip to next iteration 
) %do% { # You can use %dopar% for parallel loop execution 
    getSMA(i)(new.df) 
} 
+0

Scott - 댓글 주셔서 감사합니다. 특히 루프가 SMA로 하여금 속도를 빠르게 할 수 있도록하려면? 나는 모든 파일에 대해 SMA 절차를 수행하고 다른 모든 명령은이 코드를 나머지 코드와 통합 할 수 있습니까? –

+0

Foreach는 for 루프를 바꾸는 데 사용할 수 있습니다.(1) 루프를 병렬 처리하거나 (2) 객체/매트릭스/테이블을 빌드하기 위해 루프를 사용할 때 가장 유용하다는 것을 알게되었습니다. –

+0

위대한 - 패키지를 체크 아웃합니다! :) –

관련 문제