如何解决计算每一列的总数,然后在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
,
一种dplyr
和tibble
解决方案可能是:
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
正如我想您尝试比较两组之间的人数是否相同,可以使用卡方拟合度检验。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。