计算每一列的总数,然后在R中运行费舍尔检验

问题描述

数据:

variant disease control total
A1         1      53    54
A2         6      2     8
A3         15     37    52
A4         0      53    53
A5         65     4     69
A6         4      5     9
A7         3      34    37

我想在该行的底部添加一行,并列出该疾病和对照组的列总数,然后每行运行一条渔民,在测试中添加另一列具有p值的列。

所需结果(p值组成):

variant disease control total p-value
A1         1      53    54    0.001
A2         6      2     8     0.6921
A3         15     37    52    1
A4         0      53    53    0.98
A5         65     4     69    0.68
A6         4      5     9     0.63
A7         3      34    37    0.832
C_total    94     188

我尝试过:

rbind(df,colSums(df[,2:3]),fill=TRUE) 

但这给了我最后两列的所有列总计

尚不确定Fishers,但可以想象某种形式的Apply函数,使用每行和总计创建2x2表格。

非常感谢

解决方法

第一个问题:

rbind(df,rbind(colSums(df[,2:3])),fill = TRUE)[ (.N == seq_len(.N)),variant := "Total"][]
#    variant disease control total p-value
# 1:      A1       1      53    54  0.0010
# 2:      A2       6       2     8  0.6921
# 3:      A3      15      37    52  1.0000
# 4:      A4       0      53    53  0.9800
# 5:      A5      65       4    69  0.6800
# 6:      A6       4       5     9  0.6300
# 7:      A7       3      34    37  0.8320
# 8:   Total      94     188    NA      NA
,

一种dplyrtibble解决方案可能是:

df %>%
 add_row(variant = "Total",!!!colSums(df[-1])) %>%
 rowwise() %>%
 mutate(p_value = chisq.test(c_across(c(disease,control)),p = c(0.5,0.5))$p.value)

  variant disease control total  p_value
  <chr>     <dbl>   <dbl> <dbl>    <dbl>
1 A1            1      53    54 1.48e-12
2 A2            6       2     8 1.57e- 1
3 A3           15      37    52 2.28e- 3
4 A4            0      53    53 3.34e-13
5 A5           65       4    69 2.08e-13
6 A6            4       5     9 7.39e- 1
7 A7            3      34    37 3.46e- 7
8 Total        94     188   282 2.17e- 8

正如我想您尝试比较两组之间的人数是否相同,可以使用卡方拟合度检验。