8

SPSS では、「カスタム テーブル」を使用してカテゴリ変数の要約テーブルを簡単に作成できます。

この例は SPSS からのものです

Rでこれを行うにはどうすればよいですか?

一般的で拡張可能なソリューションが優先され、Plyr および/または Reshape2 パッケージを使用したソリューションが優先されます。

サンプルデータ: (mtcars は R インストールにあります)

df <- colwise(function(x) as.factor(x) ) (mtcars[,8:11])

PS

私の目標は、写真のようにすべてを1 つのテーブルに収めることです。私は何時間も苦労してきましたが、私の試みは非常に貧弱で、コードを投稿してもおそらく質問の理解度は向上しません。

4

6 に答える 6

7

出力を取得する1つの方法ですが、フォーマットは取得しません。

library(plyr)
ldply(mtcars[,8:11],function(x) t(rbind(names(table(x)),table(x),paste0(prop.table(table(x))*100,"%"))))
    .id 1  2       3
1    vs 0 18  56.25%
2    vs 1 14  43.75%
3    am 0 19 59.375%
4    am 1 13 40.625%
5  gear 3 15 46.875%
6  gear 4 12   37.5%
7  gear 5  5 15.625%
8  carb 1  7 21.875%
9  carb 2 10  31.25%
10 carb 3  3  9.375%
11 carb 4 10  31.25%
12 carb 6  1  3.125%
13 carb 8  1  3.125%
于 2013-02-27T12:18:16.223 に答える
6

lapply()と を使用しdo.call()rbind()ピースをつなぎ合わせるベース R ソリューション:

x <- lapply(mtcars[, c("vs", "am", "gear", "carb")], table)

neat.table <- function(x, name){
  xx <- data.frame(x)
  names(xx) <- c("Value", "Count")
  xx$Fraction <- with(xx, Count/sum(Count))
  data.frame(Variable = name, xx)
}

do.call(rbind, lapply(seq_along(x), function(i)neat.table(x[i], names(x[i]))))

結果:

   Variable Value Count Fraction
1        vs     0    18  0.56250
2        vs     1    14  0.43750
3        am     0    19  0.59375
4        am     1    13  0.40625
5      gear     3    15  0.46875
6      gear     4    12  0.37500
7      gear     5     5  0.15625
8      carb     1     7  0.21875
9      carb     2    10  0.31250
10     carb     3     3  0.09375
11     carb     4    10  0.31250
12     carb     6     1  0.03125
13     carb     8     1  0.03125

残りはフォーマットです。

于 2013-02-27T12:24:41.900 に答える
4

これが私の解決策です。かわいくないので、頭に鞄をかぶせます(関数で包みます)。また、それが一般的であることを示すために別の変数を追加します(私は願っています)。

prettyTable <- function(x) {

  tbl <- apply(x, 2, function(m) {
    marc <- sort(unique(m))
    cnt <- matrix(table(m), ncol = 1)
    out <- cbind(marc, cnt)
    out <- out[order(marc), ] # do sorting
    out <- cbind(out, round(prop.table(out, 2)[, 2] * 100, 2))
  })

  x2 <- do.call("rbind", tbl)

  spaces <- unlist(lapply(apply(x, 2, unique), length))
  space.names <- names(spaces)
  spc <- rep("", sum(spaces))
  ind <- cumsum(spaces)
  ind <- abs(spaces - ind)+1
  spc[ind] <- space.names

  out <- cbind(spc, x2)
  out <- as.data.frame(out)

  names(out) <- c("Variable", "Levels", "Count", "Column N %")
  out
}

prettyTable(x = mtcars[, c(2, 8:11)])

   Variable Levels Count Column N %
1       cyl      4    11      34.38
2                6     7      21.88
3                8    14      43.75
4        vs      0    18      56.25
5                1    14      43.75
6        am      0    19      59.38
7                1    13      40.62
8      gear      3    15      46.88
9                4    12       37.5
10               5     5      15.62
11     carb      1     7      21.88
12               2    10      31.25
13               3     3       9.38
14               4    10      31.25
15               6     1       3.12
16               8     1       3.12

パッケージを使用googleVisすると、便利なhtmlテーブルを作成できます。

plot(gvisTable(prettyTable(x = mtcars[, c(2, 8:11)])))

ここに画像の説明を入力してください

于 2013-02-27T13:04:53.177 に答える
1

次のコード スニペットが役立つ場合があります。基本パッケージ関数tablemargin.table、およびprop.tableを利用し、他のパッケージは必要ありません。ただし、名前付きの次元を持つリストに結果を収集します (これらはrbindを使用して単一の行列に収集できます)。

dat <- table(mtcars[,8:11])
result <- list()
for(m in 1:length(dim(dat))){
    martab <- margin.table(dat, margin=m)
    result[[m]] <- cbind(Freq=martab, Prop=prop.table(martab))
}
names(result) <- names(dimnames(dat))

> result
$vs
  Freq   Prop
0   18 0.5625
1   14 0.4375

$am
  Freq    Prop
0   19 0.59375
1   13 0.40625

$gear
  Freq    Prop
3   15 0.46875
4   12 0.37500
5    5 0.15625

$carb
  Freq    Prop
1    7 0.21875
2   10 0.31250
3    3 0.09375
4   10 0.31250
6    1 0.03125
8    1 0.03125
于 2013-02-27T13:50:44.643 に答える
0

freqパッケージの機能を使用した解決策は次のquestionrとおりです(恥知らずな自動プロモーション、申し訳ありません):

R> lapply(df, freq)
$vs
    n    %
0  18 56.2
1  14 43.8
NA  0  0.0

$am
    n    %
0  19 59.4
1  13 40.6
NA  0  0.0

$gear
    n    %
3  15 46.9
4  12 37.5
5   5 15.6
NA  0  0.0

$carb
    n    %
1   7 21.9
2  10 31.2
3   3  9.4
4  10 31.2
6   1  3.1
8   1  3.1
NA  0  0.0
于 2013-02-27T12:33:02.480 に答える