我有一个非常简单的问题,我可以解决这个问题,但是我宁愿在R中使用诸如dplyr.
之类的东西更有效地做事。话虽如此,这个问题对于一个公平的人来说可能很简单很好的包装。
我有一个数据帧,3列和30行(为简单起见)。我想计算第87百分位数。在那之后,我想将该分数标准化到0和1之间的范围内。非常简单:回忆标准化是通过
完成的。
所以下面的第二行是利用dplyr
的力量。
DF <- data.frame(matrix(runif(90, min=0, max=100), ncol=3,nrow=30))
DF_87th_percentile <- DF %>%
summarise_each(funs(quantile(., c(0.87)))
之后,我计算了第87百分位分数,但后来我偶然发现并开始创建min
和max
个变量,
min <- apply(DF, 2, min)
max <- apply(DF, 2, max)
然后
normalized_score <- (DF_87th_percentile - min) / (max - min)
有什么方法可以使用dplyr
重写最后的部分吗?比如,链接最后的部分或许?到目前为止,我的努力一直不好。感谢您的帮助。
答案 0 :(得分:2)
您需要将规范化作为函数编写,以便在dplyr
链中使用它。例如:
mynorm <- function(x) { (x - min(x)) / (max(x) - min(x)) }
DF <- data.frame(matrix(runif(90, min=0, max=100), ncol=3,nrow=30))
DF %>%
summarise_each(funs(quantile(., c(0.87)))) %>%
mynorm()
示例结果:
X1 X2 X3
1 0 1 0.986836
答案 1 :(得分:1)
我原以为你可以修改原来的电话:
normalized_score <- DF %>%
summarise_each(funs( (quantile(., c(0.87))-min(.) )/(max(.)-min(.)) ))
normalized_score
X1 X2 X3
1 0.9081882 0.8308022 0.9266201