2016-10-14 3 views
0

내가 다음 주소 할당 파트 2를하고 있어요 :for 루프를 줄이기 위해 R 프로그램을 수정하는 방법은 무엇입니까?

https://www.coursera.org/learn/r-programming/supplement/amLgW/programming-assignment-1-instructions-air-pollution

질문 : zip 파일은 미세 입자 물질에 ​​대한 오염 모니터링 데이터를 포함 332 쉼표로 구분 된 값 (CSV) 파일이 포함되어 (PM) 대기 오염. 미국 332 개소. 각 파일에는 단일 모니터의 데이터가 들어 있으며 각 모니터의 ID 번호는 파일 이름에 포함됩니다. 예를 들어, 모니터 200의 데이터는 "200.csv"파일에 포함됩니다. 각 파일에는 세 가지 변수가 포함됩니다.

날짜 : YYYY-MM-DD 형식 (년 - 월 - 일) 의 관측 날짜 황산염 : 해당 날짜의 대기 중 황산염 수준 (마이크로 그램 단위 입방 미터) 질산염 : 해당 날짜의 공기 중 질산염 PM 수준 (마이크로 그램/m³로 측정) 이 프로그래밍 할당을 위해이 파일의 압축을 풀고 'specdata'디렉토리를 만들어야합니다. zip 파일의 압축을 풀었 으면 'specdata'디렉토리의 파일을 수정하지 마십시오. 각 파일에서 황산염 또는 질산염 (또는 둘 다)이 누락 된 날 (NA로 코딩 됨)이 많이 있음을 알 수 있습니다. 이는 미국의 대기 오염 모니터링 데이터와 일반적입니다.

2 부

파일의 전체 디렉토리를 읽고 각 데이터 파일에 완전히 관찰 된 경우의 수를보고하는 기능을 작성합니다. 이 함수는 첫 번째 열이 파일의 이름이고 두 번째 열이 완전한 경우의 수인 데이터 프레임을 반환해야합니다.

complete <- function(directory="d:/dev/r/documents/specdata", id) { 
df <- data.frame(no=integer(), nobs=integer()) 
for (i in id) { 
    sum=0 
    myfilename = paste(directory,"/",formatC(i, width=3, flag="0"),".csv", 
         sep="") 
    masterfile = read.table(myfilename, header=TRUE, sep=",") 
    for (j in 1:nrow(masterfile)){ 
     if (!is.na(masterfile[j, 2]) && !is.na(masterfile[j, 3])){ 
      sum = sum + 1 
     } 
    } 
    df[i,]<-c(i, sum) 
} 
df 
} 

내가 디렉토리 D의 모든 001.csv, 002.csv을 ... 넣어 주 :

내 코드는 다음과 같이는/dev/R/문서/specdata, 그것은이다 왜 내가이 문자열을 매개 변수의 기본값으로 사용하는지. 당신은 중첩 된 for 루프를 사용하여이 작업을 수행하는 것을 볼 수 있으며 for 루프 중 적어도 하나를 lapply로 대체 할 수 있어야합니다. 하지만 저는 C++에 대해 잘 알고 있기 때문에 고심하고 있습니다. 그래서 lapply를 구현하는 방법을 모릅니다. Stackoverflow에 대한 몇 가지 코드를 읽고 그 중 대부분은 이해하지만 내 코드를 작성할 때 작동하게 만들 수는 없었습니다.

미리 감사드립니다. 그 동안 나는 다시 시도 할 것입니다.

답변

1

는이 같은 것을 먼저 내부주기를 교체 시작할 수 있습니다 :

rows_to_sum <- !is.na(masterfile[, 2]) & !is.na(masterfile[, 3]) 
df[i,] <- sum(masterfile[rows_to_sum, 1]) 
+0

고마워요! Lauren은 complete.cases()에 대해 언급 했으므로 첫 번째 행에이를 넣을 것입니다. 도와 주셔서 감사합니다. –

+0

Google에 대한 R 키워드는 '벡터화'입니다. 효율성 향상을 위해 모든 것을 메모리에 가지고있을 때 도움이되지만 외부/파일 루프에서 절대적으로 필요하지는 않습니다.또한 오래된 SO 사람들은 사람들이 '감사'를 주석에 넣을 때 맘에 들지 않습니다. 조심하십시오. : – Ivan

+0

그래, 몇 가지 예를 들었지만 C++에 대해 너무 편해서 아직 고민 중입니다. :) –

1

이 할당이 여러 번 "완벽한 사례"라는 문구를 사용하여 당신에게 힌트를 제공합니다. R 함수 complete.cases()를 확인해야합니다. 그것은 당신의 inner for 루프에 대한 필요성을 대체 할 것입니다.

각 파일에 대해 complete.cases (file)를 실행하십시오. 반환 된 벡터에서 TRUE 요소의 수를 셉니다. 파일 이름과 위의 숫자 을 출력하십시오.

+1

고마워, 나는 R이이 기능을 가지고 있다는 것을 알지 못한다. 정말로 도움을 청한다! –

관련 문제