scale () несовместимо с сгруппированным tbl_df

Я пытался нормализовать значения в сгруппированном tbl_df и был удивлен, увидев, что это не сработало. Однако он работает так, как ожидалось, с фреймами данных и обычными (т.е. разгруппированными) tbl_dfs

Пример:

> 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))
    

person pfabri    schedule 02.06.2016    source источник
comment
Вы не можете масштабировать одно значение с пользой, что вы пытаетесь сделать, когда оно сгруппировано.   -  person alistaire    schedule 02.06.2016
comment
Спасибо, теперь я понимаю.   -  person pfabri    schedule 03.06.2016


Ответы (1)


Как указал Алистер выше, причина, по которой это не сработало, заключалась в следующем:

Вы не можете масштабировать одно значение с пользой, что вы пытаетесь сделать, когда оно сгруппировано.

Спасибо, Алистер!

person pfabri    schedule 16.06.2016