8

byRのコマンドを使用して、データフレームのサブセットの列平均を取得しようとしています。たとえば、次のデータフレームについて考えてみます。

> z = data.frame(labels=c("a","a","b","c","c"),data=matrix(1:20,nrow=5))
> z
  labels data.1 data.2 data.3 data.4
1      a      1      6     11     16
2      a      2      7     12     17
3      b      3      8     13     18
4      c      4      9     14     19
5      c      5     10     15     20

Rのコマンドを使用byして、ラベルの列に従って列の平均を取得できます。

> by(z[,2:5],z$labels,colMeans)
z[, 1]: a
data.1 data.2 data.3 data.4
   1.5    6.5   11.5   16.5
------------------------------------------------------------
z[, 1]: b
data.1 data.2 data.3 data.4
     3      8     13     18
------------------------------------------------------------
z[, 1]: c
data.1 data.2 data.3 data.4
   4.5    9.5   14.5   19.5

しかし、出力をデータフレームに強制的に戻すにはどうすればよいですか? as.data.frame動作しません...

> as.data.frame(by(z[,2:5],z$labels,colMeans))
Error in as.data.frame.default(by(z[, 2:5], z$labels, colMeans)) :
  cannot coerce class '"by"' into a data.frame
4

3 に答える 3

11

パッケージddplyから使用できますplyr

library(plyr)
ddply(z, .(labels), numcolwise(mean))
  labels data.1 data.2 data.3 data.4
1      a    1.5    6.5   11.5   16.5
2      b    3.0    8.0   13.0   18.0
3      c    4.5    9.5   14.5   19.5

またはaggregateからstats

aggregate(z[,-1], by=list(z$labels), mean)
  Group.1 data.1 data.2 data.3 data.4
1       a    1.5    6.5   11.5   16.5
2       b    3.0    8.0   13.0   18.0
3       c    4.5    9.5   14.5   19.5

またはパッケージdcastからreshape2

library(reshape2)
dcast( melt(z), labels ~ variable, mean)

使用sapply

 t(sapply(split(z[,-1], z$labels), colMeans))
  data.1 data.2 data.3 data.4
a    1.5    6.5   11.5   16.5
b    3.0    8.0   13.0   18.0
c    4.5    9.5   14.5   19.5
于 2012-09-12T13:31:06.180 に答える
9

の出力bylistなので、それらに使用do.callrbindて、これを変換できます。

as.data.frame(do.call("rbind",by(z[,2:5],z$labels,colMeans)))
  data.1 data.2 data.3 data.4
a    1.5    6.5   11.5   16.5
b    3.0    8.0   13.0   18.0
c    4.5    9.5   14.5   19.5
于 2012-09-12T13:34:22.423 に答える
0

by出力を処理することは本当に迷惑になる可能性があります。データフレームの形式で必要なものを撤回する方法を見つけたところです。追加のパッケージは必要ありません。

したがって、これを行う場合:

aux <- by(z[,2:5],z$labels,colMeans)

次に、次のようにしてデータフレームに変換できます。

  aux_df <- as.data.frame(t(aux[seq(nrow(aux)),seq(ncol(aux))]))

auxからすべての行と列を取得し、それを転置してas.data.frameを使用しています。

それがお役に立てば幸いです。

于 2016-09-14T10:34:17.030 に答える