我在R中有一个数据框,其中每一行都是一个人,每列都是疾病代码。每个细胞包含1或0以指示个体是否患有该疾病。对于每个疾病代码X,我想将患有疾病X的个体与没有疾病X的个体分开。然后我想计算患有疾病X的患者也患有疾病Y或疾病Z的相对风险。这里是样本数据和我的方法:
# generate reproducible dataframe with disease diagnoses
set.seed(2)
ID = c(0:19)
disease0 = c(rbinom(10, 1, 0.0), rbinom(10, 1, 1.0))
disease1 = c(rbinom(10, 1, 0.1), rbinom(10, 1, 0.9))
disease2 = c(rbinom(10, 1, 0.5), rbinom(10, 1, 0.5))
disease3 = c(rbinom(10, 1, 0.9), rbinom(10, 1, 0.1))
disease4 = c(rbinom(10, 1, 1.0), rbinom(10, 1, 0.0))
(disease.df = data.frame(cbind(ID, disease0, disease1, disease2, disease3, disease4)))
row.names(disease.df) = disease.df[ ,1]
disease.df[ ,1] = NULL
disease.df
disease0 disease1 disease2 disease3 disease4
0 0 0 1 0 1
1 0 0 0 1 1
2 0 0 1 1 1
3 0 0 0 1 1
4 0 1 0 0 1
5 0 1 0 1 1
6 0 0 0 0 1
7 0 0 0 1 1
8 0 0 1 1 1
9 0 0 0 1 1
10 1 1 0 0 0
11 1 1 0 0 0
12 1 1 1 0 0
13 1 1 1 1 0
14 1 1 1 0 0
15 1 1 1 0 0
16 1 0 1 0 0
17 1 1 0 1 0
18 1 1 1 0 0
19 1 1 0 0 0
我可以使用以下代码来计算患病0的人患有1至4疾病的相对风险。
colMeans(filter(disease.df, disease0 == 1))/colMeans(filter(disease.df, disease0 != 1))
disease0 disease1 disease2 disease3 disease4
Inf 4.5000000 2.0000000 0.2857143 0.0000000
我的问题是,有没有办法使用矢量化操作或应用函数来为所有5种疾病执行此操作,同时避免使用for循环。理想情况下,它希望生成这样的表:
disease0 disease1 disease2 disease3 disease4
diease0 Inf 4.5000000 2.0000000 0.2857143 0.0000000
diease1 7.3636364 Inf 1.0227273 0.4090909 0.2045455
diease2 1.8333333 1.0185185 Inf 0.6111111 0.5238095
diease3 0.3055556 0.4583333 0.6111111 Inf 2.8518519
diease4 0.0000000 0.2222222 0.5000000 3.5000000 Inf
答案 0 :(得分:1)
不是最佳解决方案,但它可以帮助您处理重复的代码行。
t(apply(df[-1], 2, function(x) {
temp = lapply(split(df[-1], x), colMeans)
temp[[2]]/temp[[1]]
})
)
# disease0 disease1 disease2 disease3 disease4
#disease0 Inf 4.5000000 2.0000000 0.2857143 0.0000000
#disease1 7.3636364 Inf 1.0227273 0.4090909 0.2045455
#disease2 1.8333333 1.0185185 Inf 0.6111111 0.5238095
#disease3 0.3055556 0.4583333 0.6111111 Inf 2.8518519
#disease4 0.0000000 0.2222222 0.5000000 3.5000000 Inf
如果我理解正确,我们可以通过apply
和lapply
电话的组合来完成此操作。
对于每一列我们split
两个部分(具有1和0的那些)的数据帧,并使用colMeans
找到每列的均值,并按元素划分两个子列表。