5

私はRにかなりaggregate慣れていないので、データフレーム、サブジェクトごと、およびデータセットの各メトリックに対して、時系列の整形を実行しようとしています。これは見事に機能しますが、結果は非常に使いやすい形式ではないことがわかりました。結果を元のデータフレームと同じ形式に変換できるようにしたいと考えています。

例として虹彩データセットを使用します。

# 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ですべてを行うソリューションで問題ありません。plyrreshape

4

4 に答える 4

2

この場合、私が考えることができる最善の解決策は次のdata.tableとおりです。

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

解決策が必要な場合plyr、考え方は基本的に同じです。分割して各列Speciesに適用します。diff

require(plyr)
ddply(iris, .(Species), function(x) do.call(cbind, lapply(x[,1:4], diff)))
于 2013-03-02T00:15:26.460 に答える
1

私があなたの問題として理解していることは次のとおりです。現在の使用方法では、「Sepal.Length」、「Sepal.Width」などの結果がaggregate得られます。matrix

> 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」をdata.frame197列のに変換したいとします。既存の出力を使用してこれを行う方法は次のとおりです(@ Jamesから取得したトリック、ここではSO):

do.call(data.frame, iris_diff)

strそのアクションのを表示したときの出力の最初の数行は次のとおりです。

> 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
于 2013-03-02T09:51:38.973 に答える
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 ...
于 2013-03-02T02:12:59.447 に答える