【问题标题】:How to get row percentages for a 3 variable table in R?如何获取 R 中 3 个变量表的行百分比?
【发布时间】:2015-04-16 11:51:09
【问题描述】:

我有以下代码:

> library(MASS)
> with(bacteria, table(trt, y, week))
, , week = 0

         y
trt        n  y
  placebo  2 19
  drug     2 12
  drug+    1 14

, , week = 2

         y
trt        n  y
  placebo  1 19
  drug     2 11
  drug+    1 10

, , week = 4

         y
trt        n  y
  placebo  4 14
  drug     5  7
  drug+    2 10

, , week = 6

         y
trt        n  y
  placebo  1 16
  drug     5  6
  drug+    5  7

, , week = 11

         y
trt        n  y
  placebo  4 16
  drug     4  8
  drug+    4  8

如何获取上表中每一行的行百分比。我尝试了 prop.table() ,它适用于 2 个变量表,但在上面它不会产生正确的行百分比。感谢您的帮助。

编辑: 我试过了:

prop.table(with(bacteria, table(trt, y, week)))
prop.table(with(bacteria, table(trt, y, week)),1)
prop.table(with(bacteria, table(trt, y, week)),2)
prop.table(with(bacteria, table(trt, y, week)),3)

以上都没有给出正确的行百分比,第一个表如下:

         y
trt        n  y
  placebo  0.095 0.905
  drug     0.143 0.857
  drug+    0.067 0.933

或者,通过上表获得的data.frame中的这些百分比也将是完美的:

> data.frame(with(bacteria, table(trt, y, week)))
       trt y week Freq
1  placebo n    0    2
2     drug n    0    2
3    drug+ n    0    1
4  placebo y    0   19
5     drug y    0   12
6    drug+ y    0   14
7  placebo n    2    1
8     drug n    2    2
9    drug+ n    2    1
10 placebo y    2   19
11    drug y    2   11
12   drug+ y    2   10
13 placebo n    4    4
14    drug n    4    5
15   drug+ n    4    2
16 placebo y    4   14
17    drug y    4    7
18   drug+ y    4   10
19 placebo n    6    1
20    drug n    6    5
21   drug+ n    6    5
22 placebo y    6   16
23    drug y    6    6
24   drug+ y    6    7
25 placebo n   11    4
26    drug n   11    4
27   drug+ n   11    4
28 placebo y   11   16
29    drug y   11    8
30   drug+ y   11    8

【问题讨论】:

  • 你想要的输出是什么?你对prop.table 做了什么尝试?
  • @rnso 我一直在关注 data.frame 的想法。使用 dplyr 和 tidyr,这将是一种方法。 as.data.frame(with(bacteria, table(trt, y, week))) %>% spread(y, Freq) %>% mutate(n = n / (n + y), y = y / (n + y)) %>% split(., .$week)
  • @user20650:是的!这是完美的答案。请输入完整答案。谢谢。
  • @rnso 现在您从 user20650 那里得到了最佳解决方案。 :) 我今天学会了如何使用 prop.table。

标签: r


【解决方案1】:

这里有几个选项(选项 1 为 h.t. @user20650)

library(MASS)
x <- with(bacteria, table(trt, y, week))

## Option 1
out1 <- prop.table(x, c(1,3))

## Option 2
## apply() to perform prop.table row-wise;
## aperm() to permute the output back to same form as in input:
out2 <- aperm(apply(x,c(1,3),prop.table), c(2,1,3))

out2
# , , week = 0
# 
#          
# trt                n         y
#   placebo 0.09523810 0.9047619
#   drug    0.14285714 0.8571429
#   drug+   0.06666667 0.9333333
# 
# , , week = 2
# 
#          
# trt                n         y
#   placebo 0.05000000 0.9500000
#   drug    0.15384615 0.8461538
#   drug+   0.09090909 0.9090909
# 
# , , week = 4
# 
#          
# trt               n         y
#   placebo 0.2222222 0.7777778
#   drug    0.4166667 0.5833333
#   drug+   0.1666667 0.8333333
# 
# , , week = 6
# 
#          
# trt                n         y
#   placebo 0.05882353 0.9411765
#   drug    0.45454545 0.5454545
#   drug+   0.41666667 0.5833333
# 
# , , week = 11
# 
#          
# trt               n         y
#   placebo 0.2000000 0.8000000
#   drug    0.3333333 0.6666667
#   drug+   0.3333333 0.6666667

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2023-03-27
    • 2021-07-18
    相关资源
    最近更新 更多