15

これは例で最もよく示されています

str(mtcars)
mtcars$gear <- factor(mtcars$gear, labels=c("three","four","five"))
mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight"))
mtcars$am <- factor(mtcars$am, labels=c("manual","auto")
str(mtcars)
tapply(mtcars$mpg, mtcars$gear, sum)

これにより、ギアごとの合計mpgが得られます。しかし、上部に歯車があり、側面に円柱が付いた3x3のテーブルと、2変量の合計が入った9つのセルが必要だったとすると、どうすればそれを「スマートに」取得できますか。

私は行くことができました。

tapply(mtcars$mpg[mtcars$cyl=="four"], mtcars$gear[mtcars$cyl=="four"], sum)
tapply(mtcars$mpg[mtcars$cyl=="six"], mtcars$gear[mtcars$cyl=="six"], sum)
tapply(mtcars$mpg[mtcars$cyl=="eight"], mtcars$gear[mtcars$cyl=="eight"], sum)

これは面倒なようです。

それでは、どのようにして3番目の変数をミックスに入れるのでしょうか?

これは私が考えている空間にいくらかあります。 ddplyを使用した要約統計量

updateこれで私はそこに着きますが、きれいではありません。

aggregate(mpg ~ am+cyl+gear, mtcars,sum)

乾杯

4

4 に答える 4

38

これはどうですか、まだ使用していtapply()ますか?思った以上に多機能!

with(mtcars, tapply(mpg, list(cyl, gear), sum))
#       three  four five
# four   21.5 215.4 56.4
# six    39.5  79.0 19.7
# eight 180.6    NA 30.8

または、印刷出力をもう少し解釈しやすくしたい場合は、次のようにします。

with(mtcars, tapply(mpg, list("Cylinder#"=cyl, "Gear#"=gear), sum))

3 つ以上のクロス分類変数を使用する場合も、考え方はまったく同じです。結果は 3 次元以上の配列で返されます。

A <- with(mtcars, tapply(mpg, list(cyl, gear, carb), sum))

dim(A)
# [1] 3 3 6
lapply(1:6, function(i) A[,,i]) # To convert results to a list of matrices

# But eventually, the curse of dimensionality will begin to kick in...
table(is.na(A))
# FALSE  TRUE 
#    12    42 
于 2012-04-19T01:48:07.463 に答える
9

この質問に対する回答はすでに素晴らしいオプションだと思いますが、パッケージに基づいて追加のオプションを共有したかったのです (これは、データ操作にdplyr使用するクラスを現在教えているため、思いつきました。や などdplyrの特殊なベース R 関数を学生に紹介することは避けてください)。tapplyaggregate

関数を使用して必要な数の変数をgroup_byグループ化し、これらのグループからの情報を で要約できますsummarizeaggregateこのコードは、式ベースのインターフェイスよりも R の初心者にとって読みやすく、同じ結果が得られると思います。

library(dplyr)
mtcars %>%
  group_by(am, cyl, gear) %>%
  summarize(mpg=sum(mpg))
#       am   cyl  gear   mpg
#    (dbl) (dbl) (dbl) (dbl)
# 1      0     4     3  21.5
# 2      0     4     4  47.2
# 3      0     6     3  39.5
# 4      0     6     4  37.0
# 5      0     8     3 180.6
# 6      1     4     4 168.2
# 7      1     4     5  56.4
# 8      1     6     4  42.0
# 9      1     6     5  19.7
# 10     1     8     5  30.8

2 つの変数を使用すると、パッケージspreadから関数への呼び出しを追加することで、1 つの変数を行に、もう 1 つの変数を列に集計できます。tidyr

library(dplyr)
library(tidyr)
mtcars %>%
  group_by(cyl, gear) %>%
  summarize(mpg=sum(mpg)) %>%
  spread(gear, mpg)
#     cyl     3     4     5
#   (dbl) (dbl) (dbl) (dbl)
# 1     4  21.5 215.4  56.4
# 2     6  39.5  79.0  19.7
# 3     8 180.6    NA  30.8
于 2016-02-04T23:10:56.273 に答える
4

これに対するジョシュの答えが好きreshape2ですが、これらのタイプの問題に対する優れたフレームワークも提供できます。

library(reshape2)

#use subset to only grab the variables of interest...
mtcars.m <- melt(subset(mtcars, select = c("mpg", "gear", "cyl")), measure.vars="mpg")
#cast into appropriate format
dcast(mtcars.m, cyl ~ gear, fun.aggregate=sum, value.var="value")

   cyl three  four five
1  four  21.5 215.4 56.4
2   six  39.5  79.0 19.7
3 eight 180.6   0.0 30.8
于 2012-04-19T01:53:31.983 に答える
3

回答には、tapply と集計関数を使用した同じ出力が含​​まれています。

Josh O'Brien の回答に情報を追加したいと思います。ユーザーは、出力に応じて集計関数またはタップのいずれかを使用できます。tapply で複数の因子変数を使用するには、Josh が示した方法を使用できます。

データセットを読み込んでいます

data("mtcars")

タプリーの使用

with(mtcars, tapply(mpg, list("Cylinder#"=cyl, "Gear#"=gear), sum))

上記のコードの出力は

        Gear#
Cylinder#     3     4    5
    4     21.5 215.4 56.4
    6     39.5  79.0 19.7
    8    180.6    NA 30.8

集計関数の使用

with(mtcars, aggregate(mpg, list(Cylinder = cyl, Gear =  gear), sum))

集計関数の出力

    Cylinder Gear  x
1        4    3  21.5
2        6    3  39.5
3        8    3 180.6
4        4    4 215.4
5        6    4  79.0
6        4    5  56.4
7        6    5  19.7
8        8    5  30.8

ユーザーが集計関数と同じ出力を必要とするが、tapply を使用する場合。

as.data.frame(as.table(with(mtcars, tapply(mpg, list("Cylinder#"=cyl, "Gear#"=gear),
sum))))

tapply 関数の出力

   Cylinder. Gear.  Freq
1         4     3  21.5
2         6     3  39.5
3         8     3 180.6
4         4     4 215.4
5         6     4  79.0
6         8     4    NA
7         4     5  56.4
8         6     5  19.7
9         8     5  30.8

NA は、ビジネス要件に従って保持または削除できます。

于 2018-02-18T05:29:36.020 に答える