你能告诉我如何在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))
答案 0 :(得分:14)
您可以为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
答案 1 :(得分:1)
尝试使用reshape2
和acast
创建三维表格。对于那些没有数据的值,这将是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