2

ヘッダーが次のようなテーブルがあります (単純化しました)。

id, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10

ここで、id を除く各行はカテゴリ変数です。カテゴリーを A、B、C、D、E としましょう。

以下のようないくつかの列の分割表を作成したいと思います (簡潔にするために、セルにサンプル番号を入れていません)。列/行の合計を取得するのは素晴らしいことですが、必須ではありません。後で自分で計算できます。

      a1  a2  a3  a4 Total
    ----------------------
    A|
    B|
    C|
    D|
    E|
Total|

したがって、問題は、R で複数の列に基づいてクロス集計を作成する方法ですか? table() と xtabs() で見た例では、列のみを使用しています。私の場合、列は隣接しているため、1 つのクロスタブで列 a1..a4、別の a5..a7 などを要約します。これを行うエレガントな方法があることを願っています。

私はプログラマーですが、R の初心者です。

前もって感謝します。

4

2 に答える 2

7

あなたのデータは、この目的のために十分にフォーマットされていません。reshapeパッケージを使用してデータを適切に再形成する 1 つの方法を次に示します。

library(reshape)
data.m <- melt(data, id = "id")

マージンを使用してすべてのレベルのテーブルを計算するには、次を使用できます

cast(data.m, value ~ variable, margins = T)

サブセットについては、 の関連するサブセットを取得しますdata.m

于 2010-08-19T01:19:21.033 に答える
3

ベースRコマンドを使用してこれを行う方法は次のとおりです。forすべての列の係数レベルが同じである場合、ループは必要ありませんが、ループは優れたフェイルセーフになります。

> set.seed(21)
> df <- data.frame(
+   id=1:20,
+   a1=sample(letters[1:4],20,TRUE),
+   a2=sample(letters[1:5],20,TRUE),
+   a3=sample(letters[2:5],20,TRUE),
+   a4=sample(letters[1:5],20,TRUE),
+   a5=sample(letters[1:5],20,TRUE),
+   a6=sample(letters[1:5],20,TRUE) )
> 
> for(i in 2:NCOL(df)) {
+   levels(df[,i]) <- list(a="a",b="b",c="c",d="d",e="e")
+ }
> 
> addmargins(mapply(table,df[,-1]))
    a1 a2 a3 a4 a5 a6 Sum
a    6  2  0  2  5  3  18
b    3  3  7  2  1  3  19
c    5  3  1  6  5  3  23
d    6  8  6  1  5  3  29
e    0  4  6  9  4  8  31
Sum 20 20 20 20 20 20 120
于 2010-08-19T16:24:23.093 に答える