标准化子区域中R中的数据列

时间:2016-08-09 13:53:25

标签: r

我正在努力进行子组中R中数据列的标准化。

我创建了数据框:

df<-data.frame(
salesPerson=sample(c('Alan','Bob','Cindy'),20 ,replace=TRUE)
, quater=sample(c('Q1','Q2','Q3'),20 ,replace=TRUE) 
,salesValue=runif(20, 5.0, 7.5)
)

我想在数据框中添加额外的列,并使用Sales的缩放值。

要缩放所有列,我可以使用代码:

df$salesValueScaled<-scale(df$salesValue)

问题在于我想为salesPerson和quater的每个组合分别销售销售额。就像:

df$salesValueScaled<-scale(df$salesValue, by =c(df$salesPerson,df$quater))

我一直在这个论坛上寻找这个解决方案,但我无法找到解决这个问题的方法。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用dplyr

library(dplyr)

new_df <- df %>% group_by(salesPerson, quater) %>% 
  mutate(scaled_Col = scale(salesValue)) %>% 
  ungroup

要解决返回NA s的行,您可以保留原始值,也可以在缩放前将其过滤掉:

保留原始值(通过仅保留NROW大于1的实例):

new_df <- df %>% group_by(salesPerson, quater) %>% 
  mutate(scaled_Col = ifelse(NROW(salesValue) > 1, scale(salesValue), salesValue)) %>% 
  ungroup

将它们过滤掉(按照@steveb的建议):

new_df <- df %>% group_by(salesPerson, quater) %>% 
  filter(n() > 1) %>% 
  mutate(scaled_Col = scale(salesValue)) %>% 
  ungroup

我希望这会有所帮助。