使用行中的条件查找数据框中的其他行

时间:2013-07-24 22:33:57

标签: r

我的数据框有2,130个观察结果:130名中风患者和2,000名心脏病发作(MI)患者。

Index   Age     Sex Stroke  MI
1       42      M   FALSE   TRUE
2       76      M   FALSE   TRUE
3       55      F   FALSE   TRUE
4       80      M   TRUE    FALSE
5       68      F   FALSE   TRUE

str(Match)

'data.frame':   2130 obs. of  5 variables:

 $ Index : int  1 2 3 4 5 6 7 8 9 10 ...  
 $ Gender: Factor w/ 2 levels "F","M": 2 1 1 1 2 1 1 2 2 1 ...  
 $ Age   : num  45.8 44.1 67.7 37.4 46.7 72 21.4 50.8 35.8 47.2 ...  
 $ Stroke: logi  TRUE TRUE TRUE TRUE TRUE TRUE ...  
 $ MI    : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...  

对于Stroke = TRUE [测试行]的每一行,我需要一行,其中MI = TRUE [匹配的行]。

必须满足以下两个条件:

Sex in [matched row] = Sex in [test row]
Age in [matched row] equal to or within +/- 3 years of Age in [test row]

如果选择了一行进行匹配,则无法再次使用该行。由于要匹配130个击球,输出应包含130次心脏病发作。有足够的心脏病发作可供选择。在极少数情况下无法找到130,尽可能多地匹配。

我刚刚开始学习R(并且没有编程背景),我的尝试仅限于找到具有'which'和'subset'的行,例如所有男性中风患者!有关从哪里开始的任何指导?年龄和性别匹配在医学研究中很常见,其他人将从任何帮助中受益。

2 个答案:

答案 0 :(得分:3)

您的数据不适合任何测试,因为没有一个值具有可接受的匹配。我只是提供这样的机会,因为您没有处于分析阶段,而是处于设计阶段,您需要选择适当的控制,因为注册会产生额外的成本。

 str(dfrm4)
'data.frame':   15 obs. of  5 variables:
 $ Index : int  1 2 3 4 5
 $ Age   : int  42 76 55 80 68
 $ Sex   : Factor w/ 2 levels "F","M": 2 2 1 2 1
 $ Stroke: logi  FALSE FALSE FALSE TRUE FALSE
 $ MI    : logi  TRUE TRUE TRUE FALSE TRUE
#----------------

  apply(dfrm4[ dfrm4$Stroke, ] , 1, function(m) {
      possm <- dfrm4[!dfrm4$Stroke & 
                     as.character(dfrm4$Sex)==m['Sex'] & 
                     as.character(dfrm4$Index) != m['Index'] &
                     dfrm4$Age >= as.numeric(m['Age']) -3 & 
                     dfrm4$Age <= as.numeric(m['Age']) +3, ];  
       N <- NROW(possm)
       return(possm[ sample(1:N, 1), ] ) })

# --------------
$`4`
[1] Index  Age    Sex    Stroke MI    
<0 rows> (or 0-length row.names)

该结果可以转换为带有do.call(rbind,res))

的R data.frame

3岁以内只有一次中风和没有比赛。我确实在一个更大的样本上测试了一些可用的匹配,但它确实成功了......但是如果这是在分析阶段,请注意方法建议并避免匹配。不必要地使用匹配是浪费有价值的数据,并且通常是统计上的不当行为。如果医学科学的进步可能取决于此,那么最好是进行有经验的统计咨询。

答案 1 :(得分:0)

尝试在e1701包上使用matchControls功能。