1

スーパーバイザー用に特殊な要約「マトリックス」を作成しようとしていますが、R にそれをクリーンで読みやすい形式でエクスポートしてもらいたいと考えています。そのため、基本的にゼロから作成し、プロジェクトに合わせて調整しています。私の問題は、作成されたデータ フレームをインポートされたデータ フレーム、特にヘッダーのように動作させる方法がわからないことです。

ヘッダー付きのインポートされたデータ フレームを処理し、特定の行を列番号ではなく名前で呼び出すのが最も快適です。

iris$Sepal.Length
with(iris,Sepal.Length)
iris['Sepal.Length']

ここで、データ フレーム (またはマトリックス、違いがまったくわかりません) を作成する場合は、次のことを試しました。

groups<-c("Group 1", "Group 2")
factors<-c("Fac 1", "Fac 2", "Fac 3","Fac 4", "Fac 5")
x<-1:10
y<-11:20
z<-21-30

data<-cbind(groups, factors, x, y, z)
names(data) #returns NULL
data$x #clearly doesn't return the column 'x' since the matrix 'data' has no names

data<-data.frame(cbind(groups, factors, x, y, z))
names(data) #confirms that there are header names 

したがって、列 x、y、z を持つデータ フレームを作成しましたが、実際には、最初から作成された列はありません。データの行数がわかっている場合は、次のように簡単に実行できます。

data<-data.frame(1:10)
data$x<-x
data$y<-y
data$z<-z

空のデータ フレームを作成しようとしましたが、それは 1 つの要素であり、(1 より大きい長さの) ベクトルを追加しようとすると、エラーが発生します。

data<-data.frame(0)
data$x<-x #returns an error

何をすべきかについての私の最善の推測は、データの行数を調べるためにデータを 1 回通過することです (いくつかの要因レベルがあり、要約行列には考えられる要因の組み合わせごとに行があります)。次に、データ フレームを簡単に開始できます。

data<-data.frame(length(n)) #ここで、n はデータの行数になります

そして、必要な要約統計量ごとに個別のベクトルを作成し、それを ~$~ でデータ フレームに追加します。

私が試したもう 1 つの解決策は、行列を作成し、ループ内で計算しながら各要素を埋めることでした。適用ファミリがループよりも優れていることはわかっていますが、集計テーブルを自分のニーズに合わせて調整するには、適用関数を実行してから、個々のデータを取得する必要があります。

means<-with(iris,tapply(iris[,4],Species,mean))
means[1] #This returns the species and the mean petal width. What I need is the numeric part of this, as I will have my own headers, or possibly a separate summary table for each species.

適用出力から数値情報を抽出する方が、必要な統計を計算するために独自のループを構築するよりも優れているかどうかはわかりません。これは、最初にグループ (2 回の実行) で並べ替えられる入れ子になったループであり、次に因子 (5 回の実行) で実行される内部ループで、合計 10 回のデータの実行になります。空の martix を作成し、計算時にデータを適切なセルに保存することを考えていました。私の問題は、マトリックス内の特定の行を呼び出すことです。私が試してみました:

m<-matrix(0,ncol=5)
m[1,1]<-'Groups'
m[1,2]<-'Factors'
m[1,3]<-'Mean.x'
m[1,4]<-'Mean.y'
m[1,5]<-'Mean.z'

names(m) #Returns NULL

私の望ましい出力は次のようになります。

Groups   Factors   Mean.x   Mean.y   Mean.z
Group 1   Fac 1  
Group 1   Fac 2
Group 1   Fac 3

など、グループと要因のすべての組み合わせについて。

4

3 に答える 3

3

ddplyそのためにplyrパッケージから使用できます。元のデータフレームがmydataで、結果を保存する新しいデータフレームがnewdataであると仮定します。

library(plyr)
newdata<-ddply(mydata,.(Groups,Factors),summarize,mean.x=mean(x),mean.y=mean(y),mean.z=mean(z))

例:mydata<-iris

> newdata<-ddply(mydata,.(Species),colwise(mean))
> newdata
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026
于 2013-08-07T16:15:29.790 に答える
2

これはあなたが探しているものだと思いますが、一般的にあなたの質問に少し混乱しています. これは基本的に、列「グループ」と「因子」によってグループ化された各列x、y、およびzの平均のピボットテーブルを提供します

aggregate(.~groups+factors, data=data, FUN="mean")

    groups factors  x  y z
1  Group 1   Fac 1  1  1 1
2  Group 2   Fac 1  7  6 1
3  Group 1   Fac 2  8  7 1
4  Group 2   Fac 2  3  2 1
5  Group 1   Fac 3  4  3 1
6  Group 2   Fac 3  9  8 1
7  Group 1   Fac 4 10  9 1
8  Group 2   Fac 4  5  4 1
9  Group 1   Fac 5  6  5 1
10 Group 2   Fac 5  2 10 1

または種によってグループ化された虹彩データを使用します。

aggregate(.~Species, data=iris, FUN="mean")

     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026

更新: 特定の列の平均のみを計算するには、データセットの適切な列のみを集計関数に渡す (おそらく を呼び出すsubset) か、式を次のように変更します。

aggregate(cbind(Sepal.Length,Sepal.Width)~Species, data=iris, FUN="mean")
于 2013-08-07T16:22:13.650 に答える