내가 다음 주소 할당 파트 2를하고 있어요 :for 루프를 줄이기 위해 R 프로그램을 수정하는 방법은 무엇입니까?
질문 : 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에 대한 몇 가지 코드를 읽고 그 중 대부분은 이해하지만 내 코드를 작성할 때 작동하게 만들 수는 없었습니다.
미리 감사드립니다. 그 동안 나는 다시 시도 할 것입니다.
고마워요! Lauren은 complete.cases()에 대해 언급 했으므로 첫 번째 행에이를 넣을 것입니다. 도와 주셔서 감사합니다. –
Google에 대한 R 키워드는 '벡터화'입니다. 효율성 향상을 위해 모든 것을 메모리에 가지고있을 때 도움이되지만 외부/파일 루프에서 절대적으로 필요하지는 않습니다.또한 오래된 SO 사람들은 사람들이 '감사'를 주석에 넣을 때 맘에 들지 않습니다. 조심하십시오. : – Ivan
그래, 몇 가지 예를 들었지만 C++에 대해 너무 편해서 아직 고민 중입니다. :) –