data.table - Löschen von Spalte

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
R007

data.table - Löschen von Spalte

Beitrag von R007 »

Hallo,

aktuell arbeite ich mich in das Paket data.table ein. Was ich nicht ganz verstehe, ist das Löschen einer Spalte. Ich weise Data_2 die Daten von Data_1 zu, anschließend lösche ich eine Spalte in Data_2 und diese verschwindet in Data_1. Wie kann das sein?

Code: Alles auswählen

library(data.table)
Data_1 <- mtcars  
Data_1 <- setDT(Data_1, keep.rownames=TRUE)
Spalte_neu <- Data_1[,gear] / Data_1[,mean(gear)]
Data_1 <- Data_1[,Spaltenname_neu := Spalte_neu]

Data_2 <- Data_1
Data_2 <- Data_2[,Spaltenname_neu := NULL]
Gruß
R007
R007

Re: data.table - Löschen von Spalte

Beitrag von R007 »

Den Schritt der Umwandlung habe ich nicht mit gepostet, ist aber vorhanden:

Code: Alles auswählen

setDT(mtcars, keep.rownames=TRUE)
Aus dem Link von dir wird mir aber noch nicht klar, warum die Spalte auch in Data_1 gelöscht wird.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: data.table - Löschen von Spalte

Beitrag von EDi »

data.table versucht möglichts wenige Kopien zu machen, da es auf große Datenmengen ausgelegt ist.
Angenommen ich hätte eine data.frame der 80% meines RAMs füllt, dann wäre ein Kopie i) vermutlich nicht möglich (zu wenig Platz und ii) unnötige Zeitverschwendung.
Das ist bei R data.frame etwas ungünstig (R macht bei data.frame z.b. mindestens eine Kopie wenn maN etwas am data.frame ändert).
Wenn du ':=' verwendest um eine Spalte einzufügen, hängt data.table die einfach an. data.frame hingegen kopieren zuerstmal den ganzen data.frame...

Stichwort ' by reference '...

Ähnlich ist es bei '<-': data.table macht hier keine volle Kopie, sondern nur einen verweise / link / reference (wie du es auch nennen willst).
Möchtest du eine volle Kopie haben musst du copy() benutzen.



Hier ein Beispiel, welches den Speicherverbrauch zeigt und andeutet was data.table macht und warum es nicht das tut was du meinst dass es tun sollte:

Code: Alles auswählen

rm(list = ls())
library(data.table)
library(pryr)


# some data ---------------------------------------------------------------
df1 <- mtcars
# repeat data to make it bigger
df1 <- do.call("rbind", replicate(100000, df1, simplify = FALSE))
# set data.table
setDT(df1)
# add col
df1[ , m_gear := gear / mean(gear)]


# space occupied
object_size(df1) # 307 MB

# this is a copy by reference (= do not copy full object, only the reference)
mem_change(df2 <- df1) # 660 B (= nothing copied at all)
df2 <- df1

# this is a full object copy
mem_change(df3 <- copy(df1)) # 307 MB (=full size of df1 copied)
df3 <- copy(df1)


# this changes only df3 (= full copy, no reference to df1)
df3[ , m_gear := NULL]
# this changes df2 AND df1, as both point to the same reference
df2[ , m_gear := NULL]

Hoffe das hilft und veranschaulicht es.

Siehe auch ?copy und ?data.table.

BTW: Deine Erzeugung der neuen Spalte verbraucht in deiner version (neues Objekt im workspace erstellen und dann zuweisen) wesentlich mehr speicher und ist langsamer im vergleich zum Einzeiler (!). - Das ist die Power von data.table!
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: data.table - Löschen von Spalte

Beitrag von jogo »

Für die Frage nach dem warum sollte man zuerst die Vignette das Paketes data.table lesen. Hast Du das bereits getan?
https://cran.r-project.org/web/packages ... index.html

Code: Alles auswählen

library(fortunes)
fortune(85)
Gruß, Jörg
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: data.table - Löschen von Spalte

Beitrag von EDi »

jogo hat geschrieben:

Code: Alles auswählen

library(fortunes)
fortune(85)
Gruß, Jörg
Mich hat das von R007 dargestellte Problem auch in meiner Anfangszeit 'gebissen' - vorallem weil es anders ist als sonst (in R zumindest) und man nicht mit solchen (Neben-)Effekten rechnet.

Auch jetzt lerne ich durch die Vignetten immer wieder mal was dazu.
In dem Falle wäre es die 'Reference Semantics'.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
R007

Re: data.table - Löschen von Spalte

Beitrag von R007 »

Danke für eure Antworten, jetzt habe ich es verstanden!

@Jogo: Ich wollte nur den Teil hier posten, der auch relevant ist. Zudem habe ich die Variablen umgenannt. Nächstes Mal poste ich dann aber etwas mehr Code, damit ihr das Problem leichter reproduzierne könnt. Sorry!
Antworten