如何根据两个观察值之间的差异生成治疗变量?

时间:2020-04-15 17:49:07

标签: r group-by dplyr

我有一个看起来像这样的数据框。

ID <- c(1,1,2,2,3,3,4,4)
PERIOD <- c(1,2,1,2,1,2,1,2)
STATUS <- c(1,0,1,1,0,0,0,1)
TREAT <- c(0,0,0,0,0,0,0,0)
EXAMPLE <- data.frame(ID, PERIOD, STATUS, TREAT)

现在,我希望TREAT变量的所有PERIOD = 2都采用值1,其中在ID内,PERIOD = 1中的STATUS = 1,PERIOD = 2中的STATUS =0。

在此示例数据中,仅第二行就是这种情况。

我认为这将以某种方式使用group_by(ID,PERIOD)和if_else(),但是我无法弄清楚在先前的观察中如何引用该值。谁能帮我?谢谢!

1 个答案:

答案 0 :(得分:0)

您想要的是case_when()。一旦进入它,它超级有用且易于使用。我不太了解您想要的条件,但是这里有一个示例,您可以使用该示例来获取所需的信息。

  EXAMPLE %>% 
  mutate(TREAT = case_when(
    STATUS == 1 & PERIOD == 2 ~ 1,
    STATUS == 0 & PERIOD == 1 ~ 2,
    STATUS == 0 & PERIOD == 2 ~ 3,
    STATUS == 1 & PERIOD == 1 ~ 4,
    T ~ 99 # This is for all cases that are not covered by your conditions
  ))

编辑:根据您的评论,我已经使用dplyr中的first()last()编辑了我的答案。这是您需要的吗?

EXAMPLE %>% 
  group_by(ID) %>% 
  mutate(TREAT = case_when(
    first(STATUS) == 1 & last(STATUS) == 0 ~ 1,
    T ~ 0))

祝你好运!