Ich möchte eine Variable innerhalb jeder Gruppe zu standardisieren. Ich stoße in Schwierigkeiten, wenn ich die skalierte Variable später in einem Regressionsmodell benutze, wenn ich die Daten mit dplyr
aufbereite. Dies ist jedoch für plyr
nicht der Fall. Weiß jemand warum?Fehler bei der Standardisierung der Variablen pro Gruppe mit dplyr
library(plyr)
library(dplyr)
df <- mtcars[, c("cyl", "mpg")] # keep two columns
# standardize using ddply from plyr
df1 <- ddply(df, .(cyl), function(x) {
x$mpg_scaled = scale(x$mpg)
x
})
lm(mpg_scaled ~ cyl, data=df1)
Ergebnisse sind in Ordnung, alles funktioniert wie erwartet.
# standardize using mutate from dplyr
df2 <- df %>% group_by(cyl) %>%
mutate(
mpg_scaled = unlist(scale(mpg))
)
lm(mpg_scaled ~ cyl, data=df2)
Dies wirft einen Fehler (übersetzt aus Deutsch):
Error in model.frame.default(formula = mpg_scaled ~ cyl, data = df2, drop.unused.levels = TRUE) :
Variable lengths are different (found for 'cyl')
Auch wenn die Variable mpg_scaled
Zugriff auf nur wenige Einträge angezeigt werden.
df2$mpg_scaled
[,1]
[1,] 0.8648675
[2,] 0.8648675
[3,] -0.8567149
[4,] 1.1400526
[5,] 1.4062236
[6,] -1.1302245
[7,] -0.3124941
[8,] -0.5019341
[9,] -0.8567149
[10,] -0.3734655
[11,] -1.3366134
attr(,"scaled:center")
[1] 26.66364
attr(,"scaled:scale")
[1] 4.509828
Was ist los?
Versuchen Sie 'str (df2)' oder 'dim (df2 $ mpg_skaliert)', um zu sehen, was los ist - Sie haben eine Matrix dort. Sie können es zum Beispiel mit 'c (scale (mpg))' oder 'as.vector (scale (mpg))' reparieren. Obwohl sie aus irgendeinem Grund Attribute nicht fallen lassen, während sie innerhalb von 'mutate' verwendet werden - noch ein weiterer peinlicher dplyr Seiteneffekt, denke ich. –
Es könnte sich auf [dieses Problem] (https://github.com/hadley/dplyr/issues/1918) und/oder die darin referenzierten beziehen. – Henrik