关于Stata中forvalue的等效R代码

时间:2019-02-20 21:40:31

标签: r stata

当我们处理纵向复发事件时。我想检测出符合某些条件的事件。

data <- data.frame(id=c(rep(1, 4), rep(2, 3), rep(3, 3), rep(4,4)), 
               event=c(1, 1, 0, 0, 1, 1, 0, 1, 1, 0,1,1,1,1),
               eventcount=c(1, 2, 0, 0, 1, 2, 0, 1, 2, 3,1,2,3,4), 
               firstevent=c(1, 0, 0, 0, 1, 0, 0, 1, 0, 0,1,0,0,0), 
               time=c(100, 250, 150, 300, 240, 400, 150, 200, 320, 360,100,210,220,235) )   

当我们要检测发生在第一个事件后100天到150天之间的事件时。 在Stata中,我们可以使用

gen event2=1 if id==id[_n-1]& time-time[_n-1]>100 & time-time[_n-1]<=150 & firstevent[_n-1]==1 & firstevent==0 & event==1
forvalues i = 2/4 {
replace event2=1 if id==id[_n-`i']& time-time[_n-`i']>100 &time-time[_n-`i']<=150 & firstevent[_n-`i']==1 & firstevent==0 & event==1
}

我想获得下面的数据集。

data_after <- data.frame(id=c(rep(1, 4), rep(2, 3), rep(3, 3), rep(4,4)), 
               event=c(1, 1, 0, 0, 1, 1, 0, 1, 1, 0,1,1,1,1),
               eventcount=c(1, 2, 0, 0, 1, 2, 0, 1, 2, 3,1,2,3,4), 
               firstevent=c(1, 0, 0, 0, 1, 0, 0, 1, 0, 0,1,0,0,0), 
               time=c(100, 250, 150, 300, 240, 400, 150, 200, 320, 360,100,210,220,235),
               afterevent=c(NA,1,NA,NA,NA,NA,NA,NA,1,NA,NA,1,1,1)) 

如何为该Stata代码编写等效的R代码? 在原始数据中,我们有更多的ID和更多的周期性事件。

1 个答案:

答案 0 :(得分:0)

这将与您的输出相对应:

library(dplyr)

data %>%
  group_by(id) %>%
  mutate(afterevent = ifelse(time <= (time[firstevent == 1] + 150) & 
                          (time >= time[firstevent == 1] + 100), 1, NA))

输出:

# A tibble: 14 x 6
# Groups:   id [4]
      id event eventcount firstevent  time afterevent
   <dbl> <dbl>      <dbl>      <dbl> <dbl>      <dbl>
 1     1     1          1          1   100         NA
 2     1     1          2          0   250          1
 3     1     0          0          0   150         NA
 4     1     0          0          0   300         NA
 5     2     1          1          1   240         NA
 6     2     1          2          0   400         NA
 7     2     0          0          0   150         NA
 8     3     1          1          1   200         NA
 9     3     1          2          0   320          1
10     3     0          3          0   360         NA
11     4     1          1          1   100         NA
12     4     1          2          0   210          1
13     4     1          3          0   220          1
14     4     1          4          0   235          1