检测到"无效.internal.selfref"的原因是什么?使用na.locf()和data.table时的警告消息?

时间:2017-09-04 19:05:19

标签: r data.table

我有一个大型数据集(3667856 x 20),它在下面给出了一条警告信息:

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_IDPORTFOLIOOBLIGATION_NUMBER的所有组合,并找出导致问题的那些组合,但是{{ 1}}只是我拥有的81293658行数据集的一部分。我不认为我能在R中承受如此多的循环时间。

非常感谢任何建议!

1 个答案:

答案 0 :(得分:1)

很好的问题,但它不可重复,因为我们无法看到对象data的来源。这一步对帮助您至关重要。

警告信息(我写的)已包含在您的问题中,因此非常好。但它似乎只有一条长线。在这里它再次完整,所以我们可以很容易地看到它:

  

通过获取data.table的(浅)副本来检测和修复无效的.internal.selfref,以便:=可以通过引用添加此新列。在较早的时候,此data.table已被R复制(或使用structure()或类似方法手动创建)。避免使用键&lt; - ,名称&lt; - 和attr&lt; - 当前(并且奇怪地)在R中可以复制整个data.table。使用set *语法来避免复制:?set,?setnames和?setattr。另外,在R&lt; = v3.0.2中,列表(DT1,DT2)复制了整个DT1和DT2(用于复制命名对象的R&lt; list());如果是咬人,请升级到R&gt; v3.0.2。如果此消息没有帮助,请向datatable-help报告,以便解决根本原因。

第二句开始&#34;在较早的时候......&#34;。那么,这个data对象来自哪里?创建此特定data的可重现步骤是什么?是否已在警告信息帮助中提出任何已提示的提示?如果您告诉我们您在提出问题时已经阅读了警告信息并尝试了它的提示,那将会非常有用。