我该怎么做这个计算:
library(ddply)
quantile(baseball$ab)
0% 25% 50% 75% 100%
0 25 131 435 705
Run Code Online (Sandbox Code Playgroud)
按团队说,由"团队"说?我想要一个带有rownames"team"和列名"0%25%50%75%100%"的data.frame,即quantile每组一个呼叫.
干
ddply(baseball,"team",quantile(ab))
Run Code Online (Sandbox Code Playgroud)
不是正确的解决方案.我的问题是每个分组操作的OUTPUT是一个长度为5的向量.
换句话说,什么是一个巧妙的解决方案(永远不要头脑):
m=data.frame()
for (i in unique(baseball$team)){m=rbind(m,quantile(baseball[baseball$team==i, ]$ab))}
head(m,3)
X120 X120.1 X120.2 X120.3 X120.4
1 120 120.0 120.0 120.00 120
2 162 162.0 162.0 162.00 162
3 89 89.0 89.0 89.00 89
Run Code Online (Sandbox Code Playgroud)
Pat*_*ann 20
有了基础,R你可以使用tapply和do.call
library(plyr)
do.call("rbind", tapply(baseball$ab, baseball$team, quantile))
do.call("rbind", tapply(baseball$ab, baseball$team, quantile, c(0.05, 0.1, 0.2)))
Run Code Online (Sandbox Code Playgroud)
或者,与 ddply
ddply(baseball, .(team), function(x) quantile(x$ab))
Run Code Online (Sandbox Code Playgroud)
使用dplyr以下方法略有不同:
library(tidyverse)
baseball %>%
group_by(team) %>%
nest() %>%
mutate(
ret = map(data, ~quantile(.$ab, probs = c(0.25, 0.75))),
ret = invoke_map(tibble, ret)
) %>%
unnest(ret)
Run Code Online (Sandbox Code Playgroud)
在这里,您可以在probs参数中指定所需的分位数。
该invoke_map调用似乎是必需的,因为quantile它不会返回数据帧。看到这个答案。
您还可以将所有内容放入一个函数中:
get_quantiles <- function(.data, .var, .probs = c(0.25, 0.75), .group_vars = vars()) {
.var = deparse(substitute(.var))
return(
.data %>%
group_by_at(.group_vars) %>%
nest() %>%
mutate(
ret = map(data, ~quantile(.[[.var]], probs = .probs)),
ret = invoke_map(tibble, ret)
) %>%
unnest(ret, .drop = TRUE)
)
}
mtcars %>% get_quantiles(wt, .group_vars = vars(cyl))
Run Code Online (Sandbox Code Playgroud)
一种新的方法是使用group_modify()from dplyr。然后,您将致电:
baseball %>%
group_by(team) %>%
group_modify(~{
quantile(.x$ab, probs = c(0.25, 0.75)) %>%
tibble::enframe()
}) %>%
spread(name, value)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16875 次 |
| 最近记录: |