【发布时间】:2015-08-16 07:56:10
【问题描述】:
最终,我试图实现类似于以下内容,但利用dplyr 而不是plyr:
library(dplyr)
probs = seq(0, 1, 0.1)
plyr::ldply(tapply(mtcars$mpg,
mtcars$cyl,
function(x) { quantile(x, probs = probs) }))
# .id 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
# 1 4 21.4 21.50 22.80 22.80 24.40 26.0 27.30 30.40 30.40 32.40 33.9
# 2 6 17.8 17.98 18.32 18.98 19.40 19.7 20.48 21.00 21.00 21.16 21.4
# 3 8 10.4 11.27 13.90 14.66 15.04 15.2 15.44 15.86 16.76 18.28 19.2
我能想到的最好的dplyr 等价物是这样的:
library(tidyr)
probs = seq(0, 1, 0.1)
mtcars %>%
group_by(cyl) %>%
do(data.frame(prob = probs, stat = quantile(.$mpg, probs = probs))) %>%
spread(prob, stat)
# cyl 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
# 1 4 21.4 21.50 22.80 22.80 24.40 26.0 27.30 30.40 30.40 32.40 33.9
# 2 6 17.8 17.98 18.32 18.98 19.40 19.7 20.48 21.00 21.00 21.16 21.4
# 3 8 10.4 11.27 13.90 14.66 15.04 15.2 15.44 15.86 16.76 18.28 19.2
请注意,我还需要使用tidyr::spread。此外,请注意,我丢失了列标题的 % 格式,以便将第一列中的 .id 替换为 cyl。
问题:
- 是否有更好的基于
dplyr的方法来完成此任务tapply %>% ldply链? - 有没有一种方法可以兼顾两者
没有跳过太多圈的世界?也就是说,获取
%第一列的格式和正确的cyl列名称?
【问题讨论】: