我有一个看起来像这样的数据框。
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(),但是我无法弄清楚在先前的观察中如何引用该值。谁能帮我?谢谢!
答案 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))
祝你好运!