Я пытался нормализовать значения в сгруппированном tbl_df
и был удивлен, увидев, что это не сработало. Однако он работает так, как ожидалось, с фреймами данных и обычными (т.е. разгруппированными) tbl_df
s
Пример:
> df <- data.frame(year = c(1999, 2002, 2005, 2008),
LA = c(3931.120, 4273.710, 4601.415, 4101.321),
NY = c(346.82000, 134.30882, 130.43038, 88.27546))
> df
year LA NY
1 1999 3931.120 346.82000
2 2002 4273.710 134.30882
3 2005 4601.415 130.43038
4 2008 4101.321 88.27546
Все это работает нормально:
> df %>% mutate_each_(funs(scale), vars = c('LA', 'NY'))
year LA NY
1 1999 -1.0334913 1.4757715
2 2002 0.1635942 -0.3490598
3 2005 1.3086682 -0.3823639
4 2008 -0.4387712 -0.7443478
> df_tbl <- tbl_df(df)
> df_tbl %>% mutate_each_(funs(scale), vars = c('LA', 'NY'))
Source: local data frame [4 x 3]
year LA NY
(dbl) (dbl) (dbl)
1 1999 -1.0334913 1.4757715
2 2002 0.1635942 -0.3490598
3 2005 1.3086682 -0.3823639
4 2008 -0.4387712 -0.7443478
Но после группировки функция не работает:
> df.grouped <- df %>% group_by(year)
> df.grouped %>% mutate_each_(funs(scale), vars = c('LA', 'NY'))
Source: local data frame [4 x 3]
Groups: year [4]
year LA NY
(dbl) (dbl) (dbl)
1 1999 NA NA
2 2002 NA NA
3 2005 NaN NaN
4 2008 NA NA
df.grouped %>% mutate_each(funs(scale)) # Gives the same result
Я провел небольшое исследование, и стало ясно, что tbl_df
никогда не упрощает (отбрасывает), поэтому всегда возвращает data.frame.
Но это не объясняет, почему разгруппированные tbl_df
хороши, а сгруппированные - нет, тем более что в ?mutate_each
упоминается, что
... vars: переменные для включения / исключения в mutate / summarize. Вы можете использовать те же характеристики, что и в select. Если он отсутствует, по умолчанию используются все негруппирующие переменные.
ВОПРОС
Единственный способ обойти проблему - добавить
ungroup
в трубу, как показано ниже?df.grouped %>% ungroup %>% mutate_each_(funs(scale), vars = c('LA', 'NY')) # OR df.grouped %>% ungroup %>% mutate_each(funs(scale))