2017-11-09 2 views
0

스크립트가 완료되면 모든 작업을 검토 할 수 있도록 스크립트에 각 조인 작업의 입력과 출력을 문서화하는 함수를 작성하려고합니다. 이 작업을 수행 할 때 여분의 일치 등으로 인해 데이터 프레임이 비정상적으로 증가하지 않도록하고 싶습니다.문서화 된 조인 작업을위한 함수 쓰기

지금까지는 각 조인 작업을 수행 할 때마다 수동으로 레이어를 추가했습니다. 그것은 내가하고 싶은 것을 보여줍니다. 먼저 입력 파일 file1을 가져와 file2과 결합하고 file3을 만듭니다. file3file1과 같은 이름이거나 새 개체 일 수 있습니다. checkmerge은 각 병합 작업과 함께 더 길어지는 설명서 파일입니다.

merge <- "file1+file2=file3" 
count <- nrow(file1) 
check_t1 <- data.frame(merge, count) 
file3<- join(file1, file2, by = ("firmid", "year"), type = "left") 
count <- nrow(file3) 
check_t2 <- data.frame(merge, count) 
checkmerge <- rbind(checkmerge, check_t1, check_t2) 

이것은 잘 작동합니다. 그러나 수동 진행 (a)은 오류의 여지를 만들어 내고, (b) 스크립트를 부 풀리며 읽기 어렵게 만듭니다. 그래서 그 일을하는 함수를 작성하고 싶습니다. 나는 쓰기 기능에 상당히 새로운,하지만 다음 내 접근 (작동하지 않았다)이었다

##Initialize checkmerge file 

mergedat <- as.character(NULL) 
countdat <- as.numeric(NULL) 
checkmerge <- data.frame(mergedat, countdat) 

##Define function  

fun.docmerge <- function(x, y, z, crit, typ, doc = checkmerge) { 
     mergedat <- paste(deparse(substitute(x)), "+", 
         deparse(substitute(y)), "=", z) 
     countdat <- nrow(x) 
     check_t1 <- data.frame(mergedat, countdat) 
     z <- join(x, y, by = crit, type = typ) 
     countdat <- nrow(z) 
     check_t2 <- data.frame(mergedat, countdat) 
     doc <- rbind(doc, check_t1, check_t2) 
    } 

그리고 최초의 수동 방식에서와 동일한 결과를 얻기 위해 전화 :

fun.docmerge(x = file1, y = file2, z = "file3", crit = c("firmid", "year"), typ = "left") 

그러나 함수를 호출 할 때 아무 일도 일어나지 않습니다. 따라서 객체는 변경되지 않으며 오류 메시지도 표시되지 않습니다.

이전에 수동으로 복제 한 기능을 조정하려면 어떻게해야합니까?

답변

1

는 여러 가지 문제가 기능이 있습니다 라인 merge <- paste(x, "+", y, "=", z)에서 의 xy 변수 이름의 문자열하지만 dataframes의 값이 없습니다. 당신은 그 사용을 처리 할 수 ​​:

paste(deparse(substitute(x)), "+", 
    deparse(substitute(y)), "=", z) 

을 그건 그렇고, merge는 R의 기본 기능, 당신은 그런 식으로 새 개체를 호출하지 않아야합니다.

또한 checkmerge <- rbind(checkmerge, check_t1, check_t2) 줄은 현재 생성되지 않은 checkmerge 개체를 나타냅니다. 이를 rbind(check_t1, check_t2)으로 바꾸거나 함수의 인수로 checkmerge을 제공하십시오.

편집 : 당신을 가정 는 함수의 마지막 문으로 return(doc)을 추가 할 수 있고, 함수가 doc을 반환합니다.

+0

감사의 질문에 함수를 업데이트했습니다. 그러나 함수를 호출 할 때 아무 일도 일어나지 않습니다. 작업 영역의 객체도 변경되지 않으며 오류 메시지가 표시되지 않습니다. 또한 개체에 이름으로 "병합"을 지정하여 데이터가 잘못 될 위험이 있습니까? 그와 관련하여 어떤 오류 메시지도 표시되지 않았지만 데이터가 손상 될 위험이 있습니까? – deca

+0

'doc'를 반환하려면 함수의 끝에'return (doc)'을 추가해야합니다. –

+0

고마워요! 하지만 이제는 두 가지 문제가 있습니다. 먼저 병합 된 파일 (z)과 업데이트 된 체크 머 파일 (doc)을 반환해야합니다. 두 객체를 반환하려면 어떻게해야합니까? 둘째, 반환은 콘솔의 출력물로 연결됩니다. 콘솔로만 인쇄하는 대신 작업 공간에 저장된 객체를 업데이트하려면 어떻게해야합니까? – deca

관련 문제