web-dev-qa-db-ja.com

グループ平均(または他の要約統計量)を計算し、元のデータに割り当てます

mean(または長さ1の他の要約統計量、たとえばminmaxlengthsum)を計算したいグループ化変数(「グループ」)の各レベル内の数値変数(「値」)。

要約統計量は、元のデータ同じ長さを持つ新しい変数に割り当てる必要があります。つまり、元のデータの各行には、現在のグループ値に対応する値が必要です。データセットは not グループごとに1行に折りたたまれている必要があります。たとえば、グループmeanについて考えてみます。

id  group  value
1   a      10
2   a      20
3   b      100
4   b      200

id  group  value  grp.mean.values
1   a      10     15
2   a      20     15
3   b      100    150
4   b      200    150
25
Mike

これは、dplyrmutateを使用して行うことができます。

library(dplyr)
df %>%
  group_by(group) %>%
  mutate(grp.mean.values = mean(value))

...またはdata.tableを使用して、参照によって新しい列を割り当てます(:=):

library(data.table)
setDT(df)[ , grp.mean.values := mean(value), by = group]
22
Henrik

ave関数を見てください。何かのようなもの

df$grp.mean.values <- ave(df$value, df$group)

aveを使用してグループごとに他の何かを計算する場合は、FUN = your-desired-functionを指定する必要があります。 FUN = min

df$grp.min <- ave(df$value, df$group, FUN = min)
20
Henrico

1つのオプションは、plyrを使用することです。 ddplydata.frame(最初のd)を期待し、data.frame(2番目のd)を返します。他のXXply関数も同様に機能します。つまり、ldplylistを予期し、data.frameを返し、dlplyはその逆を行います...など。 2番目の引数は、グループ化変数です。 3番目の引数は、グループごとに計算する関数です。

require(plyr)
ddply(dat, "group", transform, grp.mean.values = mean(value))

  id group value grp.mean.values
1  1     a    10              15
2  2     a    20              15
3  3     b   100             150
4  4     b   200             150
7
Chase

基本関数aggregateおよびmergeを使用する別のオプションを次に示します。

merge(x, aggregate(value ~ group, data = x, mean), 
     by = "group", suffixes = c("", "mean"))

  group id value.x value.y
1     a  1      10      15
2     a  2      20      15
3     b  3     100     150
4     b  4     200     150

suffixesで「より良い」列名を取得できます。

merge(x, aggregate(value ~ group, data = x, mean), 
     by = "group", suffixes = c("", ".mean"))


  group id value value.mean
1     a  1    10         15
2     a  2    20         15
3     b  3   100        150
4     b  4   200        150
3
Greg