Это основано на ответе Андрея с использованием plyr
:
library(plyr)
ddply(d, "id", function(x) subset(x, time <= x[x$value == 6, "time"]))
id time value
1 1 0 1
2 1 1 1
3 1 2 6
4 2 0 2
5 2 1 6
6 3 0 1
7 3 1 1
8 3 2 6
ОБНОВЛЕНО ДЛЯ ОБРАЩЕНИЯ С КОММЕНТАРИИМИ В ЗАМЕЧАНИЯХ
Пример набора данных для соответствия описанию ниже:
id<-c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4)
time<-c(0,1,2,3,0,1,2,3,0,1,2,3,3,2,1)
value<-c(1,1,6,1,2,6,2,2,1,1,6,1,1,2,3)
d<-data.frame(id, time, value)
Добавьте дополнительную проверку в анонимную функцию:
ddply(d, "id",
function(x) {
if (any(x$value == 6)) {
subset(x, time <= x[x$value == 6, "time"])
} else {
x
}
}
)
Результаты проверки
id time value
1 1 0 1
2 1 1 1
3 1 2 6
4 2 0 2
5 2 1 6
6 3 0 1
7 3 1 1
8 3 2 6
9 4 3 1
10 4 2 2
11 4 1 3