分组和缩放/标准化r中的列

itj*_*s18 10 r plyr dplyr

我有一个如下所示的数据框:

  Store Temperature Unemployment Sum_Sales
1     1       42.31        8.106   1643691
2     1       38.51        8.106   1641957
3     1       39.93        8.106   1611968
4     1       46.63        8.106   1409728
5     1       46.50        8.106   1554807
6     1       57.79        8.106   1439542
Run Code Online (Sandbox Code Playgroud)

我在R中无法弄清楚的是如何分组和申请.因此,对于每个商店(分组),我想标准化/缩放两列(sum_sales和temperature).

我想要的输出如下:

  Store Temperature Unemployment Sum_Sales
1     1       1.000        8.106   1.00000
2     1       0.000        8.106   0.94533
3     1       0.374        8.106   0.00000
4     2       0.012        8.106   0.00000
5     2       0.000        8.106   1.00000
6     2       1.000        8.106   0.20550
Run Code Online (Sandbox Code Playgroud)

这是我创建的规范化功能:

 normalit<-function(m){
   (m - min(m))/(max(m)-min(m))
 }
Run Code Online (Sandbox Code Playgroud)

我正在使用dply包,似乎无法弄清楚如何分组并将该函数应用于列.我试过这样的事情并得到一个错误:

df2 <- df %.%
  group_by('Store') %.%
  summarise(Temperature = normalit(Temperature), Sum_Sales = normalit(Sum_Sales)))
Run Code Online (Sandbox Code Playgroud)

任何建议/帮助将不胜感激.谢谢.

Vin*_*ent 14

问题是您使用的是错误的dplyr动词.Summarize将为每个变量创建一个结果.你想要的是变异.Mutate更改变量并返回与原始变量长度相同的结果.请参阅http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html.以下两种方法使用dplyr:

df %>%
    group_by(Store) %>%
    mutate(Temperature = normalit(Temperature), Sum_Sales = normalit(Sum_Sales))

df %>%
    group_by(Store) %>%
    mutate_each(funs(normalit), Temperature, Sum_Sales)
Run Code Online (Sandbox Code Playgroud)

注意:Store变量在您的数据和所需结果之间是不同的.我假设@jlhoward得到了正确的数据.

  • 请参阅OPs normalit功能 (2认同)