【问题标题】:Having trouble constructing a 2*2*2 contingency table构造 2*2*2 列联表时遇到问题
【发布时间】:2021-10-18 11:15:58
【问题描述】:

文件“Aspirin”包含一个 2 × 2 × 2 列联表,列定义如下。

第 1 列:V1=观察号。 [观察 1 到 8。]

第 2 列:V2=计数。 [表格中每个单元格的非负整数计数。]

第 3 列:V3=案例/控制因素。 [因素级别 1(控制)和级别 2(案例)。]

第 4 列:V4=溃疡类型因子。 [因素 1 级(胃)和 2 级(十二指肠)。]

第 5 列:V5=阿司匹林使用系数。 [因素级别 1(非用户)和级别 2(用户)。]

> aspirin
  V1 V2 V3 V4 V5
1  1 62  1  1  1
2  2 39  2  1  1
3  3 53  1  2  1
4  4 49  2  2  1
5  5  6  1  1  2
6  6 25  2  1  2
7  7  8  1  2  2
8  8  8  2  2  2

我想在 R 中构造一个像上图一样的 2x2x2 列联表,所以我输入了以下代码:

case_control=factor(aspirin$V3)
ulcer=factor(aspirin$V4)
use=factor(aspirin$V5)
table(case_control,ulcer,use)

但是我得到了这样的东西:

, , use = 1

            ulcer
case_control 1 2
           1 1 1
           2 1 1

, , use = 2

            ulcer
case_control 1 2
           1 1 1
           2 1 1

我想要一个带有计数的列联表,所以显然上面的结果不是我想要的。有没有办法解决这个问题?

【问题讨论】:

    标签: r


    【解决方案1】:

    在你的情况下,只需使用

    ftable(case_control,ulcer,use)
    

    返回一个“平面”表

                       use 1 2
    case_control ulcer        
    1            1         1 1
                 2         1 1
    2            1         1 1
                 2         1 1
    

    这里的主要问题是,您正在丢弃 count 列。因此,作为一种替代方法,我认为这是一种更好的方法: 您可以将xtabsftable() 一起使用(此处用于dplyr 管道):

    library(dplyr)
    
    df %>% 
      transmute(ID = V1,
                Count = V2,
                Case_Control = factor(V3,
                                      labels = c("Control", "Case")),
                Ulcer_Type = factor(V4,
                                    labels = c("Gastric", "Duodenal")),
                Aspirin_Use = factor(V5,
                                     labels = c("Non-User", "User"))) %>% 
      xtabs(Count ~ Ulcer_Type + Case_Control + Aspirin_Use, data = .) %>% 
      ftable()
    

    返回

                            Aspirin_Use Non-User User
    Ulcer_Type Case_Control                          
    Gastric    Control                        62    6
               Case                           39   25
    Duodenal   Control                        53    8
               Case                           49    8
    

    数据

    df <- structure(list(V1 = c(1, 2, 3, 4, 5, 6, 7, 8), V2 = c(62, 39, 
    53, 49, 6, 25, 8, 8), V3 = c(1, 2, 1, 2, 1, 2, 1, 2), V4 = c(1, 
    1, 2, 2, 1, 1, 2, 2), V5 = c(1, 1, 1, 1, 2, 2, 2, 2)), row.names = c(NA, 
    -8L), class = c("tbl_df", "tbl", "data.frame"))
    

    【讨论】:

    • 感谢您的回复!我能问一下 c(NA,-8L) 和 class=c("tbl_df", "tbl", "data.frame")) 意味着什么吗? (我还是 R 新手)
    • @rrr 第一个意味着你的 data.frame 中有 8 行,这些行没有行名。第二个显示数据的内部结构/类。您可以在这里看到,这些数据存储在data.frametibble 中,这是一个更高级的data.frame。但对于初学者来说,这些信息并不重要。 :-)
    • 我明白了,谢谢你的解释:D
    • @rrr 你通过使用dput(df) 得到这个structure 输出。这是显示数据的最佳方式,因为其他 R 用户可以轻松地使用它们来导入数据。
    • 只是另一个问题;当返回这样的消息时,可能是什么问题; UseMethod(“transmute”)中的错误:没有适用于“transmute”的方法应用于“list”类的对象
    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    相关资源
    最近更新 更多