我有一个如下所示的数据框:
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得到了正确的数据.