この計算を行うにはどうすればよいですか?
library(ddply)
quantile(baseball$ab)
0% 25% 50% 75% 100%
0 25 131 435 705
グループごと、「チーム」ごとに?行名が「team」で列名が「0%25%50%75%100%」のdata.frameが必要です。つまり、グループごとに1つのquantile
呼び出しが必要です。
やって
ddply(baseball,"team",quantile(ab))
正しい解決策ではありません。私の問題は、グループ化された各操作の出力が、ここでは長さ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
ベース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)))
または、ddply
を使用します
ddply(baseball, .(team), function(x) quantile(x$ab))
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)
_
ここでは、probs
引数で必要な分位数を指定できます。
quantile
はデータフレームを返さないため、_invoke_map
_呼び出しが必要なようです。 この回答 を参照してください。
これらすべてを関数に入れることもできます。
_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))
_
新しいアプローチは、 group_modify()
from dplyr
を使用することです。次に、次のように呼び出します。
_baseball %>%
group_by(team) %>%
group_modify(~{
quantile(.x$ab, probs = c(0.25, 0.75)) %>%
tibble::enframe()
}) %>%
spread(name, value)
_
各変位値の計算を個別に定義し、summarise
を使用する必要があります。 .(team)
も使用します。
library(plyr)
data(baseball)
ddply(baseball,.(team),summarise, X0 = quantile(ab, probs = 0), X25 = quantile(ab, probs = 0.25), X50 = quantile(ab, probs = 0.50), X75 = quantile(ab, probs = 0.75), X100 = quantile(ab, probs = 1))
dplyr
で、非標準の分位数を使用してこれを行うことができます。
library(plyr)
data(baseball)
library(dplyr)
prob=c(0.2, 0.8)
summarise(group_by(baseball,team),
p1 = quantile(ab, probs = prob[1]),
p2 = quantile(ab, probs = prob[2]))
注意:これはdplyr::summarise
ではなく、plyr::summarise