2013-03-01 4 views
5

私はRをかなり新しくしています。aggregateを使用して、データフレーム、対象ごと、およびデータセットの各メトリックについて時系列的なシェイピングを実行しようとしています。これはきれいに動作しますが、結果は非常に使いやすい形式ではありません。私は結果を元のデータフレームと同じフォーマットに戻すことができるようにしたいと思います。R集合関数の結果を平坦化/非正規化する

例として、虹彩データセットを使用して

# Split into two data frames, one for metrics, the other for grouping 
iris_species = subset(iris, select=Species) 
iris_metrics = subset(iris, select=-Species) 
# Compute diff for each metric with respect to its species 
iris_diff = aggregate(iris_metrics, iris_species, diff) 

私はちょうど私が時系列を形作る機能を持っていることを示すためにdiffを使用していますので、私はおそらく異なる長さの時系列を取得結果、間違いなく単一の集計値(例えば平均値)ではない。

私は結果を変換したいと思います。これは、リストに値を持つセルが元の「フラット」なデータフレームになっているようです。

私はほとんどaggregateの結果でこれを管理する方法について興味がありますが、plyrまたはreshapeのすべてを行うソリューションでは大丈夫でしょう。

+0

あなたは時間シリーズについて話しています。あなたは虹彩に基づいた例を挙げていますか?あなたはdiffを使って集計しますか?理由は何ですか?それは時系列パッケージ(動物園、xts、..)の1つを使う方が良いでしょう!実際に私はあなたが何をしたいのか理解していません。(私はあなたの質問を少なくとも3回読んでいます) – agstudy

+1

@agstudy、私は思っています*質問はあなたがそれを与えると 'aggregate' 'summary'や' fivenum'などの関数や、複数の列を返す関数があります。そのような場合、結果は*複数の 'data.frame'のように見えますが、実際には' data.frame'の列として 'matrix'です。したがって、 'do.call(data.frame、...)'は、出力を "平坦化"するためのトリックを行う必要があります。 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahtoありがとうございました。私はあなたのポイントを得る。 – agstudy

答えて

2

ご存じのように、aggregateは一度に1つの列で機能します。単一の値が予想され、奇数のものは、あなたが(irisよりも少ない行で)データを取得するためにbyでこれを分割することができます。1.

は異なる長さのベクトルを返す場合に発生し、戻って一緒にそれを置くされています

b <- by(iris_metrics, iris_species, FUN=function(x) diff(as.matrix(x))) 
do.call(rbind, lapply(names(b), function(x) data.frame(Species=x, b[[x]]))) 

diff(as.matrix)これは、マトリックスには何をしたいのですが(データフレームではありません)これが使用されます。要点は、関数がそれぞれSpeciesにある行の数と異なる行数を返してirisにあることです。

2

私はこのケースで考えることができる最高のソリューションはdata.tableです:

require(data.table) 
dt <- data.table(iris, key="Species") 
dt.out <- dt[, lapply(.SD, diff), by=Species] 

そして、あなたはplyrソリューションをしたい場合は、その考え方は基本的に同じです。 Speciesで分割し、diffを各列に適用します。

​​
+0

ダウン投票者は理由を説明して、それを修正しようとする可能性がありますか? – Arun

1

入力ベクトルと同じ長さの一次差分ベクトルを返す場合は、ave関数と無名関数を使用する必要があります。 diffは、異なる長さのベクトルを返すので、NA(または選択したマーカー)でそれを拡張する必要があります。

iris_diff = lapply(iris_metrics, 
     function(xx) ave(xx, iris_species, FUN=function(x) c(NA, diff(x))) ) 
str(iris_diff) 
#-------------- 
List of 4 
$ Sepal.Length: num [1:150] NA -0.2 -0.2 -0.1 0.4 ... 
$ Sepal.Width : num [1:150] NA -0.5 0.2 -0.1 0.5 0.3 -0.5 0 -0.5 0.2 ... 
$ Petal.Length: num [1:150] NA 0 -0.1 0.2 -0.1 ... 
$ Petal.Width : num [1:150] NA 0 0 0 0 0.2 -0.1 -0.1 0 -0.1 ... 

あなたはデータフレームとしてちょうどそれのまわりdata.frameをラップすることを望んでいた場合。そして、元のグループ化ベクトルを含めることが良いでしょう:

iris_diff <- data.frame(Species= iris_species, iris_diff) 
str(iris_diff) 
#------ 
'data.frame': 150 obs. of 5 variables: 
$ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ Sepal.Length: num NA -0.2 -0.2 -0.1 0.4 ... 
$ Sepal.Width : num NA -0.5 0.2 -0.1 0.5 0.3 -0.5 0 -0.5 0.2 ... 
$ Petal.Length: num NA 0 -0.1 0.2 -0.1 ... 
$ Petal.Width : num NA 0 0 0 0 0.2 -0.1 -0.1 0 -0.1 ... 
1

は、ここで私はあなたの問題として理解して何:aggregateを使用してあなたの現在の方法では、あなたは「Sepal.Length」の結果についてmatrixを取得します、 "Sepal.Width"などがあります。

> str(iris_diff) 
'data.frame': 3 obs. of 5 variables: 
$ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 2 3 
$ Sepal.Length: num [1:3, 1:49] -0.2 -0.6 -0.5 -0.2 0.5 ... 
$ Sepal.Width : num [1:3, 1:49] -0.5 0 -0.6 0.2 -0.1 0.3 -0.1 -0.8 -0.1 0.5 ... 
$ Petal.Length: num [1:3, 1:49] 0 -0.2 -0.9 -0.1 0.4 ... 
$ Petal.Width : num [1:3, 1:49] 0 0.1 -0.6 0 0 0.2 0 -0.2 -0.3 0 ... 

しかし、は197列を持つdata.frameように見えるものとして表示されるコンソール、インチ

"iris_diff"をに、197列に変換します。私たちはそのアクションのstrを表示したときにここで

do.call(data.frame, iris_diff) 

は、出力の最初の数行です:ここでは、あなたの既存の出力(私はSOに@James、hereからピックアップトリック)とすることを行うことができます方法です

> str(do.call(data.frame, iris_diff)) 
'data.frame': 3 obs. of 197 variables: 
$ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 2 3 
$ Sepal.Length.1 : num -0.2 -0.6 -0.5 
$ Sepal.Length.2 : num -0.2 0.5 1.3 
$ Sepal.Length.3 : num -0.1 -1.4 -0.8 
$ Sepal.Length.4 : num 0.4 1 0.2 
$ Sepal.Length.5 : num 0.4 -0.8 1.1 
$ Sepal.Length.6 : num -0.8 0.6 -2.7 
$ Sepal.Length.7 : num 0.4 -1.4 2.4 
$ Sepal.Length.8 : num -0.6 1.7 -0.6 
$ Sepal.Length.9 : num 0.5 -1.4 0.5 
$ Sepal.Length.10: num 0.5 -0.2 -0.7 
関連する問題