Ich habe einen Legacy-R-Code geerbt, mit dem einige Werte in einer Spalte basierend auf einem Wert in einer anderen Spalte in derselben Zeile umgeschrieben wurden dass irrtümlich dachte, ein boolescher Wert sein, wenn in Wirklichkeit diese Werte waren tatsächlich (Strings umgewandelt werden) Faktoren, etwa so:R: Zufälliges Subsetting eines Datenrahmens unter Verwendung einer Faktorspalte, als wäre es logisch
df <- data.frame(value = c(1, 2, 3, 4, 5, 6),
reversed = c("true", "false",
"true", "true",
"false", "false"))
str(df)
#> 'data.frame': 6 obs. of 2 variables:
#> $ value : num 1 2 3 4 5 6
#> $ reversed: Factor w/ 2 levels "false","true": 2 1 2 2 1 1
df$recoded_value <- df$value
df$recoded_value[df$reversed] <- 7 - df$recoded_value[df$reversed]
Wenn Sie die Ergebnisse überprüfen, dies erzeugt unbeabsichtigte Ergebnisse. df[2, "recoded_value"]
ist 5, aber die Absicht ist es für 2 zu sein. Darüber hinaus ist df[3, "recoded_value"]
3, aber die Absicht ist es zu sein 4.
Ich würde gerne verstehen, was hier vor sich geht. Meine erste Hypothese war, dass R einen Faktor als TRUE
und den anderen als FALSE
behandelt. Aber das ist natürlich nicht der Fall, weil identische Faktorstufen sind nicht identisch behandelt werden:
df[c(1,3), ]
#> value reversed recoded_value
#> 1 1 true 6
#> 3 3 true 3
df[c(2,5), ]
#> value reversed recoded_value
#> 2 2 false 5
#> 5 5 false 5
Was ist hier los?
Um zu verdeutlichen: Ich bin nicht an Lösungen für das Problem interessiert. Ich weiß, wie man den Code repariert, um die beabsichtigten Ergebnisse zu erzielen. Ich würde gerne verstehen:
- Warum funktioniert dieser Code überhaupt? Wie können Sie eine Teilmenge auf der Grundlage einer Faktorspalte erstellen? Was macht
`[`
, um dies zu ermöglichen? - Warum werden die Dinge, die den gleichen Wert haben (, d. H., gleiche Ebene eines Faktors) unterschiedlich behandelt?
Danke für die Antwort! Nicht sicher warum ich das vorher nicht bemerkt habe. Ich denke, ich wählte schlechte Zahlen, wenn ich das minimale Beispiel konstruierte; Ich hätte keine Werte auswählen sollen, die mit der Zeilennummer identisch sind. ': -p' Jedenfalls, danke. +1 –