1

我想在 R 中重新创建这个 Stata 命令

 by Area Sex Age: keep if (Infected==1) | ((_n<=1*ncases) & (Infected==0))

这是一个匹配的病例对照研究

我的数据框包含 193 个案例和每组可变数量的控件(区域性别和年龄)。我正在尝试根据区域性别和年龄分组为每个案例匹配 1 个随机对照。

ncases是我的数据框中的一个整数,表示每组中的病例数(区域性别年龄)

上面的命令行在 Stata 中运行良好。

但是,我编写的 R 代码仅适用于第一组:

dat5 <- subset(dat4,by=list(Area,Sex,Age),(Infected=1 | 
                                        ((seq(dim(dat4)[1]))<=1*ncases & Infected==0)))

这是我的数据框 dat4: Infected=1 是一个案例,infected=0 是一个控件。

        Area  Sex Age  CensusNo   Animals Infected ncases 
18825   1     1   23   1023224    0       0        1 
18826   1     1   23   1024109    1       0        1 
18827   1     1   23   1024163    0       1        1 
41428   7     2   50   1047107    1       0        1 
41429   7     2   50   1047029    1       0        1 
41430   7     2   50   1046901    1       1        1 
41439   5     1   36   1047037    1       0        2 
41440   5     1   36   1047127    1       0        2 
41441   5     1   36   1047125    1       0        2 
41442   5     1   36   1047005    1       0        2 
41443   5     1   36   1046994    0       1        2 
41444   5     1   36   1046972    0       1        2 
4

2 回答 2

1

一个data.table解决方案。

library(data.table)
ddd <- data.table(dat4)
ddd[, {
  # coerce integer Infected to logical
  # not really necessary,  but for robustness
  ii <- as.logical(Infected)
  # if Infected == 1, then ii == TRUE
  if(ii){ # if TRUE, keep all cases
    .SD
    } else {
        # alternatively keep a sample of
        # the 
    .SD[sample.int(.N, size = ncases)]
    }
  } ,  by=list(Area,Sex,Age,ncases, Infected)]
于 2013-04-05T02:39:09.623 回答
1

函数中没有by参数subset。我将构造一个索引向量,对于案例和每个类别中的控件样本,该索引向量为 TRUE:

chosen <- by(dat4, INDICES= list(Area,Sex,Age), 
          FUN=function(d) {
                 idx <- d[['Infected']]==1 |
                 (d[['Infected']]==0 & sample( (1:NROW(d)) <= d[["ncases"]][1] ))
                 return( d[idx,]}
chosen <- do.call(rbind, chosen)

最后一部分对我来说有点笨拙。我正在构建一个逻辑值向量,然后用sample函数对其进行置换。该by函数返回一个列表,其中包含每个类别的条目。在这种情况下,您需要rbind“将它们堆叠起来”。我怀疑有一种更具表现力的方式来进行采样,并且那些神经通路只是需要更多的咖啡因。(在您为此目的提供样本数据集之前,也未经测试。)

于 2013-04-03T16:22:40.713 回答