2016-08-09 10 views
0

Während meines Arbeitsablaufs erstelle ich oft eine Kopie der Hauptdatei data.frame/data.table, in der ich einige Aspekte der Arbeit mache, und dann einige andere auf der anderen Kopie, bevor ich sie oder etwas später anschließe auf. Ich habe jedoch oft erlebt, dass diese Kopien noch miteinander verbunden sind. Damit auch auf einem getan Änderungen am other.Unfortunately fertig sind bin ich es zu replizieren, nicht in der Lage, aber kopieren-Einfügen von meiner Konsole sieht es so etwas wie diese:Angeschlossene Kopien von data.tables

# 'used3' is a copy of 'used' with some altercations to it 
c("nLocs","nDays") %in% names(used) 
[1] FALSE FALSE 
> used3[, nDays :=uniqueN(yDay),c("ID","Year","Season")] 
> used3[, nLocs :=.N,c("ID","Year","Season")] 
> c("nLocs","nDays") %in% names(used) 
[1] TRUE TRUE 

, so dass auf der Kopie gemacht Änderungen sind allso getan auf dem Original. Ist das ein Fehler? Rufe ich sie zu ähnlichen Namen ... oder was?

R-Version: 3.3 data.table Version: 1.9.6

Aber auch bei älteren Versionen von R erfahren und data.table

+0

Blick auf 'data.table :: copy' – jbaums

+0

Dank! Das war einer dieser "Wie habe ich das vermisst ?!". Sollten Sie es als Antwort hinzufügen, damit ich es akzeptieren kann? –

+0

Siehe auch [this] (http://stackoverflow.com/questions/10225098/understanding-exactly-when-a-data-table-is-a-reference-to-vs-a-copy-of-another) und die verknüpften Fragen. Auch [dies] (http://stackoverflow.com/questions/15913417/why-does-data-table-update-namesdt-by-reference-even-if-i-assign-to-another-v/15913648#15913648) –

Antwort

1

Sie sollten dieses Verhalten nicht mit data.frame sehen, aber Sie werden es für data.table Objekte sehen.

?data.table::copy erklärt, dass data.tables verhindert Schaffung Kopien, wo immer möglich, und das Ergebnis ist, dass nach einem data.table mit set* oder := Operatoren wie Modifizierung:

library(data.table) 
A <- data.table(x=1:10) 
B <- A 
A[, y:=10:1] 

B 
##  x y 
## 1: 1 10 
## 2: 2 9 
## 3: 3 8 
## 4: 4 7 
## 5: 5 6 
## 6: 6 5 
## 7: 7 4 
## 8: 8 3 
## 9: 9 2 
## 10: 10 1 

A und B noch identisch sind (dh Element y wurde zu beiden hinzugefügt).

Unterm Strich also eine Kopie eines data.table zu machen, können Sie stattdessen tun:

A <- data.table(x=1:10) 
B <- copy(A) 
A[, y:=10:1] 

B 
##  x 
## 1: 1 
## 2: 2 
## 3: 3 
## 4: 4 
## 5: 5 
## 6: 6 
## 7: 7 
## 8: 8 
## 9: 9 
## 10: 10 

Beachten Sie, dass die $ Operator zu einem data.tableein Element hinzuzufügen, tut Ergebnis in eine Kopie gemacht wird:

A <- data.table(x=1:10) 
B <- A 
A$y <- 10:1 

B 
##  x 
## 1: 1 
## 2: 2 
## 3: 3 
## 4: 4 
## 5: 5 
## 6: 6 
## 7: 7 
## 8: 8 
## 9: 9 
## 10: 10 
Verwandte Themen