次のように、コストーマーがどれだけのお金を使っているかを詳細に記録するデータフレームがあります。
custid, value
1, 1
1, 3
1, 2
1, 5
1, 4
1, 1
2, 1
2, 10
3, 1
3, 2
3, 5
次のように、平均、最大、中央値、標準などを使用して特性を計算する方法は?適用機能を使用しますか?そしてどうやって?
custid, mean, max,min,median,std
1, ....
2,....
3,....
代替に追加するために、「doBy」パッケージのsummaryBy
を使用します。これにより、適用する関数のlist
を指定できます。
library(doBy)
summaryBy(value ~ custid, data = mydf,
FUN = list(mean, max, min, median, sd))
# custid value.mean value.max value.min value.median value.sd
# 1 1 2.666667 5 1 2.5 1.632993
# 2 2 5.500000 10 1 5.5 6.363961
# 3 3 2.666667 5 1 2.0 2.081666
もちろん、ベースRに固執することもできます。
myFun <- function(x) {
c(min = min(x), max = max(x),
mean = mean(x), median = median(x),
std = sd(x))
}
tapply(mydf$value, mydf$custid, myFun)
# $`1`
# min max mean median std
# 1.000000 5.000000 2.666667 2.500000 1.632993
#
# $`2`
# min max mean median std
# 1.000000 10.000000 5.500000 5.500000 6.363961
#
# $`3`
# min max mean median std
# 1.000000 5.000000 2.666667 2.000000 2.081666
cbind(custid = unique(mydf$custid),
do.call(rbind, tapply(mydf$value, mydf$custid, myFun)))
# custid min max mean median std
# 1 1 1 5 2.666667 2.5 1.632993
# 2 2 1 10 5.500000 5.5 6.363961
# 3 3 1 5 2.666667 2.0 2.081666
library(dplyr)
dat%>%
group_by(custid)%>%
summarise(Mean=mean(value), Max=max(value), Min=min(value), Median=median(value), Std=sd(value))
# custid Mean Max Min Median Std
#1 1 2.666667 5 1 2.5 1.632993
#2 2 5.500000 10 1 5.5 6.363961
#3 3 2.666667 5 1 2.0 2.081666
より大きなデータセットの場合、data.table
はより高速です
setDT(dat)[,list(Mean=mean(value), Max=max(value), Min=min(value), Median=as.numeric(median(value)), Std=sd(value)), by=custid]
# custid Mean Max Min Median Std
#1: 1 2.666667 5 1 2.5 1.632993
#2: 2 5.500000 10 1 5.5 6.363961
#3: 3 2.666667 5 1 2.0 2.081666
Plyrパッケージを使用できます
分割適用結合戦略
ddply(dataframe, .(groupcol), function)
あなたの場合
ddply(dataframe, .(custid), summarize, "mean"= mean(value), "median" = median(value))
あなたがあなたのための良い例を持っているddplyのヘルプを見てください
dplyr
を使用して、すべての列または同じ列に多数の関数を適用する場合は、summarise_each
またはmutate_each
:
require(dplyr)
dat %>%
group_by(custid) %>%
summarise_each(funs(max, min, mean, median, sd), value)
#Source: local data frame [3 x 6]
#
# custid max min mean median sd
#1 1 5 1 2.666667 2.5 1.632993
#2 2 10 1 5.500000 5.5 6.363961
#3 3 5 1 2.666667 2.0 2.081666
または、ベースRのaggregate
を持つ別のオプション:
aggregate(value ~ custid, data = dat, summary)
# custid value.Min. value.1st Qu. value.Median value.Mean value.3rd Qu. value.Max.
#1 1 1.000 1.250 2.500 2.667 3.750 5.000
#2 2 1.000 3.250 5.500 5.500 7.750 10.000
#3 3 1.000 1.500 2.000 2.667 3.500 5.000
(これには標準偏差は含まれていませんが、他の記述統計のニースのアプローチだと思います。)
psych
パッケージのdescribeBy()
が好きです。このような
df <- structure(list(custid. = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L,
3L, 3L), value = c(1L, 3L, 2L, 5L, 4L, 1L, 1L, 10L, 1L, 2L, 5L
)), .Names = c("custid.", "value"), class = "data.frame", row.names = c(NA,
-11L))
df
custid. value
1 1 1
2 1 3
3 1 2
4 1 5
5 1 4
6 1 1
7 2 1
8 2 10
9 3 1
10 3 2
11 3 5
# install.packages(c("psych"), dependencies = TRUE)
require(psych)
describeBy(df$value, df$custid.)
group: 1
vars n mean sd median trimmed mad min max range skew kurtosis se
1 1 6 2.67 1.63 2.5 2.67 2.22 1 5 4 0.21 -1.86 0.67
-----------------------------------------------------------------------
group: 2
vars n mean sd median trimmed mad min max range skew kurtosis se
1 1 2 5.5 6.36 5.5 5.5 6.67 1 10 9 0 -2.75 4.5
-----------------------------------------------------------------------
group: 3
vars n mean sd median trimmed mad min max range skew kurtosis se
1 1 3 2.67 2.08 2 2.67 1.48 1 5 4 0.29 -2.33 1.2
または、必要に応じて行列として取得し、
describeBy(df$value, df$custid., mat=T, skew = F)
item group1 vars n mean sd median min max range se
11 1 1 1 6 2.666667 1.632993 2.5 1 5 4 0.6666667
12 2 2 1 2 5.500000 6.363961 5.5 1 10 9 4.5000000
13 3 3 1 3 2.666667 2.081666 2.0 1 5 4 1.2018504