2017-09-20 6 views
0
를 사용할 때 찾을 수없는 객체

내 코드는 다음과 같습니다 : 내 데이터의이 오류 (EXPR, envir, enclos가) : 평가

Form_CharSizePorts2 <- function(main, size, var, wght, ret) { 

    main.cln <- main %>% 

    select(date, permno, exchcd, eval(parse(text=size)), eval(parse(text=var)), eval(parse(text=wght)), eval(parse(text=ret))) %>% 
    data.table 


    Bkpts.NYSE <- main.cln %>% 
    filter(exchcd == 1) %>% 
    group_by(date) %>% 
    summarize(var.P70 = quantile(.[[var]], probs=.7, na.rm=TRUE), 
       var.P30 = quantile(.[[var]], probs=.3, na.rm=TRUE), 
       size.Med = quantile(.[[size]], probs=.5, na.rm=TRUE)) 


    main.rank <- main.cln %>% 
    merge(Bkpts.NYSE, by="date", all.x=TRUE) %>% 
    mutate(Size = ifelse(.[[size]]<size.Med, "Small", "Big"), 
      Var = ifelse(.[[var]]<var.P30, "Low", ifelse(.[[var]]>var.P70, "High", "Neutral")), 
      Port = paste(Size, Var, sep=".")) 

    Ret <- main.rank %>% 
    group_by(date, Port) %>% 
    summarize(ret.port = weighted.mean(.[[ret]], .[[wght]], na.rm=TRUE)) %>% 
    spread(Port, ret.port) %>% 
    mutate(Small = (Small.High + Small.Neutral + Small.Low)/3, 
      Big = (Big.High + Big.Neutral + Big.Low)/3, 
      SMB = Small - Big, 
      High = (Small.High + Big.High)/2, 
      Low = (Small.Low + Big.Low)/2, 
      HML = High - Low) 

    return(Ret) 
} 











Form_FF4Ports <- function(dt) { 
    dt.cln <- dt %>% 
    group_by(permno) %>% 
    mutate(lag.ret.12t2 = lag(ret.12t2, 1)) 

    output <- dt.cln %>% 
    group_by(date) %>% 
    summarize(MyMkt = weighted.mean(retadj.1mn, w=port.weight, na.rm=TRUE)) %>% 
    as.data.frame %>% 
    merge(Form_CharSizePorts2(dt.cln, "lag.ME.Jun", "lag.BM.FF", "port.weight", "retadj.1mn"), 
      by="date", all.x=TRUE) %>% 
    transmute(date, MyMkt, MySMB=SMB, MySMBS=Small, MySMBB=Big, MyHML=HML, MyHMLH=High, MyHMLL=Low) %>% 
    merge(Form_CharSizePorts2(dt.cln, "lag.ME.Jun", "lag.ret.12t2", "port.weight", "retadj.1mn"), 
      by="date", all.x=TRUE) %>% 
    transmute(date, MyMkt, MySMB, MySMBS, MySMBB, MyHML, MyHMLH, MyHMLL, MyUMD=HML, MyUMDU=High, MyUMDD=Low) 
    return(output) 
} 




dt.myFF4.m <- Form_FF4Ports(data.both.FF.m) 

일부는 다음과 같습니다 :

 date permno shrcd exchcd cfacpr cfacshr shrout  prc vol retx retadj.1mn  me port.weight datadate 
1 Dec 1925 10006 10  1 7.412625 7.260000 600 109.00 NA NA   NA 65.40000   NA  <NA> 
2 Dec 1925 10022 10  1 9.365437 9.365437 200 56.00 NA NA   NA 11.20000   NA  <NA> 
3 Dec 1925 10030 10  1 9.969793 9.155520 156 150.00 NA NA   NA 23.40000   NA  <NA> 
4 Dec 1925 10057 11  1 4.000000 4.000000 500 12.25 NA NA   NA 6.12500   NA  <NA> 
5 Dec 1925 10073 10  1 0.200000 0.200000 138 17.50 NA NA   NA 2.41500   NA  <NA> 
6 Dec 1925 10081 10  1 1.000000 1.000000 1192 9.00 NA NA   NA 10.72800   NA  <NA> 
7 Dec 1925 10102 10  1 18.137865 18.000000 201 109.75 NA NA   NA 22.05975   NA  <NA> 
8 Dec 1925 10110 10  1 1.010000 1.000000 500 10.50 NA NA   NA 5.25000   NA  <NA> 
9 Dec 1925 10129 10  1 1.000000 1.000000 270 -132.00 NA NA   NA 35.64000   NA  <NA> 
10 Dec 1925 10137 11  1 21.842743 20.920870 613 71.75 NA NA   NA 43.98275   NA  <NA> 
    comp.count at revt ib dvc BE OpProf GrProf Cflow Inv AstChg Davis.bkeq d.shares ret.12t2 ME.Dec ME.Jun BM.FF OpIB 
1   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
2   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
3   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
4   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
5   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
6   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
7   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
8   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
9   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
10   NA NA NA NA NA NA  NA  NA NA NA  NA   NA  NA  NA  NA  NA NA NA 
    GrIA CFP.FF BM.m CFP.m lag.ME.Jun lag.BM.FF lag.OpIB lag.AstChg 
1 NA  NA NA NA   NA  NA  NA   NA 
2 NA  NA NA NA   NA  NA  NA   NA 
3 NA  NA NA NA   NA  NA  NA   NA 
4 NA  NA NA NA   NA  NA  NA   NA 
5 NA  NA NA NA   NA  NA  NA   NA 
6 NA  NA NA NA   NA  NA  NA   NA 
7 NA  NA NA NA   NA  NA  NA   NA 
8 NA  NA NA NA   NA  NA  NA   NA 
9 NA  NA NA NA   NA  NA  NA   NA 
10 NA  NA NA NA   NA  NA  NA   NA 

때 I을 타고, 오류 메시지가 Error in eval(expr, envir, enclos) : object 'lag.ME.Jun' not found 있어요.

여기에 eval(parse(text =)) 함수를 사용하고 환경이 올바르게 설정되지 않은 것 같습니다. 그러나이 함수 외에도 서로 다른 열 이름을 가진 데이터에 적합한 범용 목적 함수를 만들 때 어떤 접근 방법을 사용해야하는지 잘 모르겠습니다.

특히 함수에서 사용하기 전에 열 이름을 변경하지 않고 다른 데이터 프레임에 대해 어떻게 함수를 사용할 수 있는지 알고 싶습니다.

답변

0

귀하의 문제는 '프로그래밍으로 dplyr'vignette에서 논의되고 해결됩니다.

을 사용하여 lag.ME.Jun을 인용하는 대신 결말은 enquo(lag.ME.Jun)!!lag.ME.Jun에 의존해야합니다. 그러나 이것은 함수 호출에 있어야 함을 의미합니다.

다른 여러 지점의 함수는 함수 환경에서 생성되지 않은 변수 (예 : exchcd, date)도 참조하므로 R은 현재 이러한 변수가 포함되지 않은 데이터 집합에서 오류를 발생시킵니다. 일반적으로 함수가 함수 호출에 포함되지 않은 입력에 의존하는 것은 현명하지 않습니다.

+0

문제점을 파악했습니다. 정말 고마워 – BOBO