scale()与分组的tbl_df不兼容

时间:2016-06-02 17:45:40

标签: r group-by dplyr scale normalize

我试图将分组 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))
    

1 个答案:

答案 0 :(得分:0)

正如Alistaire上面指出的那样,之所以没有这样做是因为:

  

您无法有效地扩展单个值,这是您在对其进行分组时尝试执行的操作。

谢谢你,Alistaire!