Я хочу стандартизировать переменную в каждой группе. У меня возникают проблемы при использовании масштабированной переменной в модели регрессии после подготовки данных с использованием dplyr
. Однако это не относится к plyr
. Кто-нибудь знает, почему?Ошибка при стандартизации переменной для каждой группы с использованием 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)
Результаты в порядке, все работает должным образом.
# standardize using mutate from dplyr
df2 <- df %>% group_by(cyl) %>%
mutate(
mpg_scaled = unlist(scale(mpg))
)
lm(mpg_scaled ~ cyl, data=df2)
Это выдает ошибку (в переводе с немецкого):
Error in model.frame.default(formula = mpg_scaled ~ cyl, data = df2, drop.unused.levels = TRUE) :
Variable lengths are different (found for 'cyl')
Кроме того, при обращении к переменной mpg_scaled
, только несколько записей показано на рисунке.
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
Что происходит?
Попробуйте 'str (df2)' или 'dim (df2 $ mpg_scaled)', чтобы посмотреть, что происходит, у вас есть матрица. Вы можете исправить это с помощью 'c (scale (mpg))' или 'as.vector (scale (mpg))' например. Хотя по какой-то причине они не отбрасывают атрибуты при использовании в 'mutate', но еще одна неудобная сторона dplyr влияет на меня. –
Это может быть связано с [этой проблемой] (https://github.com/hadley/dplyr/issues/1918) и/или теми, на которые они ссылаются. – Henrik