2017-09-04 4 views
0

내가 나에게 아래의 경고 메시지를 제공하는 대형 데이터 세트 (× 20 3667856)를 가지고na.locf()를 data.table과 함께 사용하면 ".internal.selfref detected invalid"경고 메시지의 가능한 원인은 무엇입니까?

: 나는 다음과 같은 간단한 (아직 유사) 예를 만들어 더 나은 상황을 이해하기 위해
library(data.table) 
library(zoo) 

data[, new_quant_PD := na.locf(QUANT_PD,na.rm=FALSE), by=c('OBLIGOR_ID','PORTFOLIO','OBLIGATION_NUMBER')] 
Warning messages: 
1: In `[.data.table`(data, , `:=`(new_quant_PD, na.locf(QUANT_PD, ... : 
    Invalid .internal.selfref detected and fixed by taking a (shallow) copy of the data.table so that := can add this new column by reference. At an earlier point, this data.table has been copied by R (or been created manually using structure() or similar). Avoid key<-, names<- and attr<- which in R currently (and oddly) may copy the whole data.table. Use set* syntax instead to avoid copying: ?set, ?setnames and ?setattr. Also, in R<=v3.0.2, list(DT1,DT2) copied the entire DT1 and DT2 (R's list() used to copy named objects); please upgrade to R>v3.0.2 if that is biting. If this message doesn't help, please report to datatable-help so the root cause can be fixed. 

tmp = data.table(name=c('Zhao','Zhao','Zhao','Qian','Qian','Sun','Sun','Li','Li','Li'),score=c('B+',NA,'B',NA,NA,NA,'A',NA,'A-',NA)) 
tmp 


    name score 
1: Zhao B+ 
2: Zhao NA 
3: Zhao  B 
4: Qian NA 
5: Qian NA 
6: Sun NA 
7: Sun  A 
8: Li NA 
9: Li A- 
10: Li NA 


tmp[,new_score:=na.locf(score,na.rm=FALSE),by='name'] 
tmp 


name score new_score 
1: Zhao B+  B+ 
2: Zhao NA  B+ 
3: Zhao  B   B 
4: Qian NA  NA 
5: Qian NA  NA 
6: Sun NA  NA 
7: Sun  A   A 
8: Li NA  NA 
9: Li A-  A- 
10: Li NA  A- 

이 작은 예는 경고 메시지를 전혀 생성하지 않습니다. 이론적으로

내가 할 수 OBLIGOR_ID, PORTFOLIOOBLIGATION_NUMBER하고, 문제를 일으키는 어느 (들)입니다 (이다) 알아,하지만 data의 모든 조합을 통해 루프는 내가 가지고 81293658 행 데이터 세트의 일부입니다. R에서 너무 많은 루프 시간을 가질 여유가 없다고 생각합니다.

모든 의견을 크게 환영합니다!

+4

어떻게'data' 데이터 테이블을 만들었습니까? 경고는 뭔가 잘못되었을 수도 있음을 분명히 암시합니다. – Jaap

답변

1

좋은 질문이지만 객체 data의 출처를 알 수 없기 때문에 재현 할 수 없습니다. 이 단계는 당신을 돕는 데 매우 중요합니다.

경고 메시지 (내가 작성한)는 질문에 포함되어 있습니다. 그러나 하나의 긴 줄로 보인다. 여기에 다시 채워져 쉽게 볼 수 있습니다 :

유효하지 않은 .internal.selfref는 data.table의 복사본을 취해서 감지되었습니다 : =이 새로운 열을 참조로 추가 할 수 있습니다. . 이전 시점에서이 data.table은 R에 의해 복사되었거나 구조체() 또는 유사한 것을 사용하여 수동으로 생성되었습니다. < -, 이름 < - 및 attr <을 피하십시오. 현재 R에서 (이상하게도) 전체 data.table을 복사 할 수 있습니다. 복사를 피하기 위해 set * 구문을 사용하십시오 :? set,? setnames 및? setattr. 또한 R < = v3.0.2에서 list (DT1, DT2)는 전체 DT1과 DT2 (명명 된 객체를 복사하는 데 사용 된 R의 list())를 복사했습니다. R> v3.0.2로 업그레이드하십시오. 이 메시지가 도움이되지 않으면 근본 원인을 수정할 수 있도록 datatable-help에보고하십시오.

두 번째 문장은 "At an early point ..."로 시작합니다. 그래서,이 data 객체가 왔습니까? 이 특정 data을 만드는 재현 가능한 단계는 무엇입니까? 이미 경고 메시지에 도움이 될만한 힌트가 있습니까? 질문을 할 때 경고 메시지를 읽고 힌트를 시험해 보았다면 도움이 될 것입니다.

+0

감사합니다. Matt! 데이터에는 data.frame에서 병합 된 열이 있습니다. 합병 후에도 "클래스"가 "data.table" "data.frame"이었지만 na.locf 함수가 제대로 작동하려면 data.table로 변환해야했습니다. –