我正在努力进行子组中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))
我一直在这个论坛上寻找这个解决方案,但我无法找到解决这个问题的方法。
提前感谢您的帮助。
答案 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
我希望这会有所帮助。