在R中使用dplyr进行有效链接

时间:2015-01-07 22:19:55

标签: r dplyr

我有一个非常简单的问题,我可以解决这个问题,但是我宁愿在R中使用诸如dplyr.之类的东西更有效地做事。话虽如此,这个问题对于一个公平的人来说可能很简单很好的包装。

我有一个数据帧,3列和30行(为简单起见)。我想计算第87百分位数。在那之后,我想将该分数标准化到0和1之间的范围内。非常简单:回忆标准化是通过

完成的。

enter image description here

所以下面的第二行是利用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百分位分数,但后来我偶然发现并开始创建minmax个变量,

min <- apply(DF, 2, min)
max <- apply(DF, 2, max)

然后

normalized_score <- (DF_87th_percentile - min) / (max - min)

有什么方法可以使用dplyr重写最后的部分吗?比如,链接最后的部分或许?到目前为止,我的努力一直不好。感谢您的帮助。

2 个答案:

答案 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