R - Stichprobe, die in% in% verwendet wird, ändert den Datenrahmen, der untergeordnet ist

8

Ich bin mir nicht sicher, ob ich die Frage richtig betitelt habe, weil ich den Grund des folgenden Verhaltens nicht vollständig verstehe:

%Vor%

Ich erwarte, dass der endgültige Druck 15 zeigt, aber nicht. Stattdessen erscheint 13 oder 14 und dfSet wird so geändert, dass es mindestens zwei Zeilen mit der gleichen ID gibt. Es scheint, dass dieser Teil des Codes:

%Vor%

modify $ ID Spalte - Ich weiß nicht warum?

Workaround:

%Vor%

In diesem Fall funktioniert alles wie erwartet - es gibt 15 Zeilen mit eindeutiger ID.

Die Frage ist, warum die direkte Verwendung von Stichproben in% in% den Datenrahmen verändert?

    
her_dom 03.08.2016, 19:55
quelle

3 Antworten

7

Was das Problem zu sein scheint, ist, dass R eine knifflige Sache macht, wenn Sie Funktionsrückgabewerten zuweisen. Zum Beispiel etwas wie

%Vor%

würde in den meisten Sprachen sehr merkwürdig aussehen. Wie weisen Sie dem Rückgabewert einer Funktion einen Wert zu? Was wirklich passiert ist, dass eine Funktion namens names<- definiert ist. Im Grunde wird eine transformierte Version des ursprünglichen Objekts zurückgegeben, die dann verwendet werden kann, um den an diese Funktion übergebenen Wert zu ersetzen. Es sieht wirklich so aus

%Vor%

Die Variable a wird immer vollständig ersetzt, nicht nur ihre Namen.

Wenn Sie etwas wie

tun %Vor%

Was wirklich passiert, ist

%Vor%

Jetzt wird es etwas komplizierter, wenn Sie versuchen, sowohl [] als auch $ subsetting zu machen. Schau dir dieses Beispiel an

%Vor%

Beachten Sie, dass "Testen" zweimal gedruckt wird. Was vor sich geht, ist wirklich mehr wie

%Vor%

Also wird f(x,1) zweimal ausgewertet. Dies bedeutet, dass sample ebenfalls doppelt ausgewertet wird.

Der Fehler ist etwas offensichtlicher, wenn Sie versuchen, eine Variable zu ersetzen, die noch nicht existiert

%Vor%

Hier erhalten Sie die Warnung, weil die Variable .temp1. die Spalte hinzugefügt hat und jetzt 4 Spalten hat, aber wenn Sie versuchen, die Zuweisung zu .temp2. durchzuführen, haben Sie jetzt ein Problem, dass Sie das Segment des Datenrahmens sind zu versuchen, zu ersetzen ist eine andere Größe.

Die IDs werden ersetzt, weil der Operator $<- nicht nur eine neue Spalte zurückgibt, sondern auch einen neuen data.frame mit der Spalte, die auf den von Ihnen zugewiesenen Wert aktualisiert wurde. Dies bedeutet, dass die Zeilen, die aktualisiert wurden, zusammen mit der ID zurückgegeben werden, die bei der Zuweisung vorhanden war. Dies wird in der Variable .temp1. gespeichert. Wenn Sie die Zuordnung [<- ausführen, wählen Sie eine neue Gruppe von Zeilen aus, die Sie austauschen möchten. Die Werte aller Spalten dieser Zeilen werden durch die Werte von .temp1. ersetzt. Dies bedeutet, dass Sie die IDs für die Ersetzungszeilen überschreiben und diese möglicherweise abweichen, sodass Sie wahrscheinlich mit zwei oder mehr Kopien einer bestimmten ID enden.

    
MrFlick 03.08.2016, 21:20
quelle
2

Obwohl ich mir nicht 100% ig sicher bin, vermute ich, dass R sample zweimal ausführt. Wenn Sie in R unterteilen und zuweisen, zum Beispiel:

%Vor%

Es wird ausgewertet als "nimm die Zeilen i bis j aus x als temporären Datenrahmen heraus, weise der v1 Spalte dieses Datenrahmens 1 zu und kopiere dann den temporären Datenrahmen zurück in die Reihen i bis j in x".

Vielleicht wird der Indexierungsausdruck (i: j) zweimal ausgeführt (einmal zum Extrahieren und einmal zum Zurücksetzen), und wenn es sich um eine Zufallsvariable handelt, werden die Ergebnisse in andere Zeilen als die ursprünglich ausgewählten Zeilen zurückgestellt .

    
Philippe Marchand 03.08.2016 20:42
quelle
1

Betrachten Sie dieses einfachere Beispiel:

%Vor%

Was die zweite Zeile tatsächlich tut, ist

%Vor%

Sie können sehen, dass $<- nur eine Funktion ist, die drei Argumente, ein Objekt, ein Name und ein Wert. (Beachten Sie, dass die Backticks notwendig sind, wenn Sie $<- direkt verwenden möchten.)

Das Problem, das ich denke, ist, dass in Ihrem Beispiel x ein Ausdruck ist, der bewertet jedes Mal, wenn es ausgewertet wird, aufgrund des Aufrufs zu verschiedenen Dingen sample , also sollten Sie dies vermeiden.

Eine Alternative ist die Verwendung von [<- , die dieses Problem scheinbar nicht hat:

%Vor%     
Ernest A 03.08.2016 21:16
quelle

Tags und Links