-1

集計結果を取得するにはどうすればよいですか?

x=iris[,1:4]
transform(x,"sum"=apply(x,MARGIN=1,FUN=sum))

出力は次のとおりです。

    Sepal.Length Sepal.Width Petal.Length Petal.Width  sum
1            5.1         3.5          1.4         0.2 10.2
2            4.9         3.0          1.4         0.2  9.5
3            4.7         3.2          1.3         0.2  9.4
4            4.6         3.1          1.5         0.2  9.4

(多くの行は省略されています)、集計をもっとよく知りたいだけですが、集計関数で適用するのと同じ結果を得るのは難しいかもしれません。

4

2 に答える 2

2

あなたの質問は、私が期待していたコードとは多少異なっているようです。aggregate特定の関数を列に「適用」することを目的としていますが、「by」引数によって区切られたカテゴリ内のみです。「特定のカテゴリ内に集約する」ように設計されています。

apply(コードのように1ではなく2に設定された2番目の引数を使用して)列全体で関数を使用します。グループ化変数はありません。あなたのコーダーは、異なる意味とインポートのベクトルで行ごとに実行されているため、各個人の 4 つの異なる測定値の個々の合計を返します。これは、手順の準備または基礎が確立されていない限り、間違いなく無意味なプロセスです。

集計で達成されるのと同様の方法で適用を使用したい場合は、これらを見てください。

> sapply( split(iris[,1:4], iris[, 5]), apply, 2, sum)
             setosa versicolor virginica
Sepal.Length  250.3      296.8     329.4
Sepal.Width   171.4      138.5     148.7
Petal.Length   73.1      213.0     277.6
Petal.Width    12.3       66.3     101.3


> aggregate(iris[ ,1: 4], iris[5], FUN=sum)
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        250.3       171.4         73.1        12.3
2 versicolor        296.8       138.5        213.0        66.3
3  virginica        329.4       148.7        277.6       101.3

目標がカテゴリごとの計算を行わない場合は、データフレームの行数と同じ長さのリストを集約して渡します。

> aggregate(iris[ ,1: 4], list(rep(1,nrow(iris))),  FUN=sum)
  Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
1       1        876.5       458.6        563.7       179.9
> apply(iris[1:4], 2, sum)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 
于 2012-12-29T05:13:18.187 に答える
0

applyルーベンスが正しく、の代わりに使用したい場合、および今日の以前の投稿と同じ表現にaggregate興味がある場合は、を使用できます。aggregatetapply

~ の全体的な意味は何ですか?

x=iris[,1:4]
names(x)<-c("x1","x2","x3","x4")
aggregate(x1+x2+x3+x4~x1,FUN=sum,data=x)
tapply((x$x1 + x$x2 + x$x3 + x$x4), x$x1, sum)

DWinの回答から追加sapplyおよび変更して編集し、上記とlapply同じ回答、およびtapply再 フォーマットされた機能を提供します。aggregaterapplyvapplytapplyby

with(x, sapply(split((x1 + x2 + x3 + x4), x1), sum))
with(x, lapply(split((x1 + x2 + x3 + x4), x1), sum))
with(x, rapply(split((x1 + x2 + x3 + x4), x1), sum))
with(x, tapply(      (x1 + x2 + x3 + x4), x1 , sum))
with(x, vapply(split((x1 + x2 + x3 + x4), x1), sum, FUN.VALUE=1))
with(x, by((x1 + x2 + x3 + x4), x1, sum))

で同じ答えを得る方法がわかりませんmapply。さて、ここに1つの方法がありますが、それはかなりばかげています:

tapply(mapply(sum, x$x1 , x$x2 , x$x3 , x$x4), x$x1, sum)

最後に、apply(inside tapply) を使用して上記の他の行と同じ答えを得る方法を次に示します。

tapply(apply((x[,1:4]),1,sum),x$x1,sum)

最後に、投稿のステートメントaggregateと同じ回答を本当に返したい場合は、それが可能です。applyただし、行っているのは、個々の行をapplyステートメントで合計しているだけです。aggregateしたがって、次のように、Iris データ セットの各行に個別のグループがあると「だまして」考える必要があります。

x=iris[,1:4]
names(x)<-c("x1","x2","x3","x4")
apply.sums <- transform(x,"sum"=apply(x,MARGIN=1,FUN=sum))
my.factor <- seq(1, nrow(x))
ag.sums <- aggregate(x1+x2+x3+x4~my.factor,FUN=sum,data=x)
round(ag.sums[,2],2) == round(apply.sums[,5],2)
于 2012-12-29T05:21:13.353 に答える