2017-03-07 60 views
1

我在R中有一个数据框,其中每行是一个个体,每列是一个疾病代码。每个细胞含有1或0来表示个体是否患有该疾病。对于每个疾病编码X,我想将患有疾病X的个体与没有疾病X的个体分开。然后,我想计算患有疾病X的患者也患有疾病Y或疾病Z的相对风险。下面是样本数据而我的方法:如何计算R中矩阵中所有条件对的相对风险?

# 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个人也通过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 

我的问题是有疾病1,有没有办法使用矢量化操作或应用函数为所有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

在看到以下Ronak的评论之前,我保存了上述编辑内容。对不起,有任何困惑。 – Josh

回答

0

不是最佳的解决方案,但是它可以帮助你从代码重复的线条。

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 

如果我理解正确的话,我们可以通过applylapply调用组合做到这一点。

对于我们split两个部分(带有1的和那些用0)数据帧的每一列,并找到使用colMeans每一行的均值和分两个子列表元素明智的。