我有一个DF看起来像这样(但实际上有更多的数据!):
我试图查看每个主题并确定“触发器”切换到1,2或3之前的“条件”是什么。具体来说,我试图在“触发器”之前创建一个包含三个“Condtitions”的信息的新DF。变为1,2或3。
if(df$Trigger >= 1){
copie 3 rows before trigger (including row with trigger>=1) >= 1 of same Subject and delete rest.
}
结果应如下所示:
我已经试图解决这个问题好几个星期,但我太没经验了。我很感激任何帮助。
从你上面所说的if语句是我把它拿走了。基本上它是找到开关发生的位置,在切换之前找到三行并将其包含在FinalDF
中:
library(tidyverse)
df <- tibble::tribble(
~Subject, ~Testperiod, ~Condition, ~Trigger,
1, 1, 0, 0,
1, 2, 0, 0,
1, 3, 1, 0,
1, 4, 2, 0,
1, 5, 3, 0,
1, 6, 3, 1,
1, 7, 1, 1,
1, 8, 1, 1,
1, 9, 0, 1,
1, 10, 0, 1,
1, 11, 0, 1,
1, 12, 0, 0,
2, 1, 0, 0,
2, 2, 2, 0,
2, 3, 3, 0,
2, 4, 3, 0,
2, 5, 3, 2,
2, 6, 2, 2,
2, 7, 1, 1,
2, 8, 2, 1,
2, 9, 0, 1,
2, 10, 0, 0,
2, 11, 0, 0,
2, 12, 0, 0
)
colchanges <- which(df$Trigger != dplyr::lag(df$Trigger))
ChangesDF <- cbind(rownum = colchanges,value = df[colchanges,"Trigger"])
rows <- dplyr::filter(ChangesDF,Trigger %in% c(1:3)) %>% select(rownum) %>%
mutate(One = rownum - 1,
Two = rownum - 2,
Three = rownum - 3)
rows <- sort(as.vector(t(rows)))
rows <- rows[rows > 0]
FinalDF <- df[rows,]
FinalDF
# A tibble: 12 x 4
Subject Testperiod Condition Trigger
<dbl> <dbl> <dbl> <dbl>
1 1 3 1 0
2 1 4 2 0
3 1 5 3 0
4 1 6 3 1
5 2 2 2 0
6 2 3 3 0
7 2 4 3 0
8 2 4 3 0
9 2 5 3 2
10 2 5 3 2
11 2 6 2 2
12 2 7 1 1