8

three dimensional表でパーセンテージを取得する方法を教えてください。two dimensional次のコマンドを実行して、テーブルにパーセンテージを作成する方法を知っています

p <-with(mtcars,tapply(carb,list(cyl,vs),length))
prop.table(p,2) # by column

ただし、別の変数を追加しようとすると、どうすればいいですか?

p <- with(mtcars,tapply(carb,list(cyl,vs,gear),length))
4

2 に答える 2

17

関数への複数レベルの入力を指定できますprop.table。ここで、1 = 行、2 = 列、3 = 層などです。

簡単な例:

test <- 1:8
dim(test) <- c(2,2,2)
test
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

次に、次のようなことができます。

# % of all values in each stratum/sub-table
prop.table(test,3)

# row % within each stratum/sub-table
prop.table(test,c(3,1))

# column % within each stratum/sub-table
prop.table(test,c(3,2))

を処理する簡単な方法があるかもしれませんNAが、ラウンドアバウト バージョンは、それらを として設定し0、次に としてリセットすることNAです。

# set one of the values to NA as an example
test[7] <- NA

# do the procedure
nas <- is.na(test)
test[nas] <- 0
result <- prop.table(test,c(3,2))
result[nas] <- NA

result
, , 1

          [,1]      [,2]
[1,] 0.3333333 0.4285714
[2,] 0.6666667 0.5714286

, , 2

          [,1] [,2]
[1,] 0.4545455   NA
[2,] 0.5454545    1
于 2012-10-31T05:13:14.760 に答える
1

reshape2とを使用acastして、3 次元のテーブルを作成してみてください。これは、データのない値0の代わりになります。NA

library(reshape2)
tables  <- acast(mtcars, cyl~vs~gear,value.var = 'carb', fun.aggregate = 'length')
 tables
, , 3

   0 1
4  0 1
6  0 2
8 12 0

, , 4

  0 1
4 0 8
6 2 2
8 0 0

, , 5

  0 1
4 1 1
6 1 0
8 2 0

prop.table(tables, 2:3)

, , 3

  0         1
4 0 0.3333333
6 0 0.6666667
8 1 0.0000000

, , 4

  0   1
4 0 0.8
6 1 0.2
8 0 0.0

, , 5

     0 1
4 0.25 1
6 0.25 0
8 0.50 0

電話tableの代わりに使用することもできますtapply

with(mtcars,table(cyl, vs ,gear))

, , gear = 3

   vs
cyl  0  1
  4  0  1
  6  0  2
  8 12  0

, , gear = 4

   vs
cyl  0  1
  4  0  8
  6  2  2
  8  0  0

, , gear = 5

   vs
cyl  0  1
  4  1  1
  6  1  0
  8  2  0

次にprop.table、適切な次元で使用します

于 2012-10-31T05:30:08.710 に答える