假设我有以下数据。
Table is_exposed disease value
1 1 1 4
1 1 0 100
1 0 1 20
1 0 0 80
2 1 1 10
2 1 0 40
2 0 1 15
2 0 0 30
Table
代表具有以下格式的2x2表中的每个表。
Exposed Not Exposed
---------- --------------
Disease a b
No Disease c d
我将如何在dplyr中进行以下计算?
a/(a+b)
和c/(c+d)
[应该为上述数据的4个值]risk2-risk1
[根据上述数据应为2个值]ad/bc
[根据上述数据应为2个值]Table disease risk
1 1 .167
1 0 .556
2 1 .2
2 0 .33
和
Table risk_diff odds_ratio
1 .389 .16
2 .13 .5
df %>%
split(df$Table) %>%
lapply(function(x){
tab = xtabs(value ~ is_exposed + disease, data = x) %>%
as.list() %>%
setNames(c("d", "c", "b", "a")) %>%
data.frame()
}) %>%
do.call(rbind, .) %>%
mutate(Risk_d1 = a/(a+b),
Risk_d0 = c/(c+d),
Risk_diff = Risk_d1-Risk_d0,
Odds_ratio = (a*d)/(b*c))
# d c b a Risk_d1 Risk_d0 Risk_diff Odds_ratio
# 1 80 100 20 4 0.1666667 0.5555556 -0.3888889 0.16
# 2 30 40 15 10 0.4000000 0.5714286 -0.1714286 0.50
笔记:
xtabs
创建一个is_exposed
对照表disease
并将其关联value
到每个对应的单元格的交叉表:
df %>%
split(df$Table) %>%
lapply(function(x){
tab = xtabs(value ~ is_exposed + disease, data = x)
})
# $`1`
# disease
# is_exposed 0 1
# 0 80 20
# 1 100 4
#
# $`2`
# disease
# is_exposed 0 1
# 0 30 15
# 1 40 10
为了通过引用的每个小区a
,b
,c
,和d
,我扁平每个表与as.list
和使用setNames
,从而分配适当的标签。lapply
返回一个列表,因此do.call(rbind, .)
将两个“行”组合在一起,并使其成为一个数据框:
df %>%
split(df$Table) %>%
lapply(function(x){
tab = xtabs(value ~ is_exposed + disease, data = x) %>%
as.list() %>%
setNames(c("d", "c", "b", "a")) %>%
data.frame()
})
# $`1`
# d c b a
# 1 80 100 20 4
#
# $`2`
# d c b a
# 1 30 40 15 10
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句