2016-11-25 1 views
0

안녕하세요, 내가 이전에 악기에 의해 일괄 적으로 생성 된 모든 .txt 파일에서 하나의 다른 플롯을 생성하는 R 스크립트를 만들려고 노력하고배치 여러 플롯

, 같은 위치 스크립트의 폴더.

저는 R과 프로그래밍에서 일반적으로 (프로그래밍까지 1-2 개월) 매우 열악합니다.

.txt 파일에는 헤더가없는 두 개의 열 V1 및 V2가 있습니다.

  • 나는 폴더에있는 모든 TXT 파일의 목록을 얻을 : 코드를 생성하기 전에

    ``` 
    library(tidyverse) 
    library(ggsci) 
    
    fileNames <- list.files(getwd(), full.names = T, pattern="txt") 
    #print(fileNames) 
    
    Speed_selection <- grep('speed', fileNames, value=TRUE) 
    
    length <- length(Speed_selection) 
    
    i <- 1 
    
    if(i<=length){ 
        #print(Speed_selection[i]) 
        Speed <- read.table((Speed_selection[i]), header=F, sep="") 
    
        p <- ggplot(Speed)+geom_line(aes(V1,V2)) 
        ggsave("plot.pdf", p) 
    
        i=i+1 
        i 
    } else { 
        print("Finished") 
    } 
    ``` 
    

    내 생각은 다음과 같다 : 여기

    내가 생성 한 코드입니다. 목록을 확인하고 txt 파일 만 인쇄합니다.
  • 이름에 "speed"가있는 .txt 파일 만 선택합니다.
  • 이 난에 1의 값을 할당
  • 는 IF 루프 : 나 (I과
    • 파일 선택의 I^번째 파일을 읽어 상기 선택된 파일의 개수보다 = < 경우 = 1 , 첫 번째 파일) 나는 플롯을
    • 나는 1

그래서 NEX으로 난을 증가

  • 그것을 디렉토리를 저장 t 라운드는 i = 2로 시작합니다.

    루프는 "Speed_selection"의 모든 길이를 통과하지 않기 때문에 문제가 있습니다. 첫 번째 파일에 해당하는 하나의 플롯 만 얻습니다.

    내가 뭘 잘못하고 있니?

    감사합니다.

    감사합니다.

  • +0

    그것은 "plot.pdf"매번 덮어 쓸 것입니다, 그래서 당신은 단지 하나의 출력을 얻을 것입니다. 루프를 구현하려면 처음에는 'for'가 있어야합니다. 또한,'ggsave'가 성취 된 후에'p <- plot (V2 ~ V1, Speed, "l")'은 무엇입니까? –

    +0

    답장을 보내 주셔서 감사합니다. 나는 그렇게 생각했지만 선택 목록의 첫 번째 파일을 두 번째 파일이 아닌 (덮어 쓰기의 결과로 발생하는 것처럼) 플로팅하는 중입니다 ... ggsave 이후 줄거리에 대한 수정을 주셔서 감사합니다.정상적인 플롯 기능이 문제를 해결할 수 있는지 확인하려고했습니다. – Mollan

    답변

    0

    다음은 이미 tidyverse을 사용하고 있기 때문에 도우미 기능과 purrr를 사용하여 접근 방식이다.

    library(tidyverse) 
    library(ggsci) 
    
    print_plots <- function(x) { 
    
        data <- read.table(x, header=F, sep="") 
    
        file_name <- sprintf("%s plot.pdf", basename(x)) 
    
        p <- ggplot(data) + 
         geom_line(aes(V1,V2)) 
    
        ggsave(file_name, p) 
    
    } 
    
    fileNames <- list.files(getwd(), full.names = T, pattern="txt") 
    
    Speed_selection <- grep('speed', fileNames, value = TRUE) 
    
    walk(Speed_selection, ~print_plots(.x)) 
    

    또는 파이프에

    : 당신은 루프를 가지고 있다면

    list.files(getwd(), full.names = T, pattern="txt") %>% 
         grep('speed', ., value = TRUE) %>% 
         walk(Speed_selection, ~print_plots(.x)) 
    
    +0

    이것은 완벽하게 작동했으며 이유는 알 수 없습니다. 교과서로 돌아 가기 ... 도와 줘서 고마워! – Mollan

    +0

    후드에서'purr'은'apply' 계열의 함수를 사용하고 있습니다. 이 함수는 목록/벡터의 각 요소에 다른 함수를 적용합니다. 'walk' 함수는'sapply'를 사용하지만 출력을 생성하지 않습니다. 본질적으로 함수는 파일 목록을 통해 함수를 처리하고 'print_plots'도우미 함수의 부작용은 PDF 파일에 플롯을 작성합니다. –

    1

    너무 복잡하게 보입니다. 다음과 같은 일을 성취하지 않겠습니까?

    for(x in list.files(getwd(), full.names = T, pattern="\\.txt")) 
    { 
        Speed <- read.table(x, header=F, sep="") 
    
        p <- ggplot(Speed) + 
        geom_line(aes(V1,V2)) 
    
        ggsave(p,filename=paste0(gsub("\\..*","",x),"_plot.pdf")) 
    } 
    
    +0

    죄송합니다, 이것은 다음과 같은 오류를 줬습니다 : "오류 :'device'는 NULL, 문자열 또는 함수 여야합니다." – Mollan

    +0

    나는 어느 것이'ggplot2' 객체인지 명시 적으로 밝히지 않았고 어느 것이 파일명인지 밝히지 않았다. 지금은 어때? – boshek

    +0

    예, 감사합니다. 이제 작동합니다. 파일 이름에 문제가 있었지만 (이름에 0.5가 있음) 미리 알 수 없었습니다. 다시 도움을 주셔서 감사합니다! – Mollan