web-dev-qa-db-ja.com

グループごとに複数の分位数をddply

この計算を行うにはどうすればよいですか?

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
13
Florian Oswald

ベースRでは、tapplydo.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))
21

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)
_
6
slhck

各変位値の計算を個別に定義し、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))
3
Mikko

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

2
Nick Isaac