2015-07-24 5 views
1

Я относительно новичок в R, и у меня есть вопрос относительно того, как выполнять условную агрегацию с использованием data.tables (или других методов), сохраняя при этом доступ к столбцам таблицы по ссылке. Был ответ на аналогичный вопрос here, но он занимает много времени на моих данных и занимает много памяти. Вот некоторые игрушки данные:R data.table условный (мин./Макс.) Агрегация

t <- data.table(User=c(1,1,1,1,1,2,2,2,2,3,3,3,3,3,3), 
    Obs=c(1,2,3,4,5,1,2,3,4,1,2,3,4,5,6), 
    Flag=c(0,1,0,1,0,0,1,0,0,1,0,0,0,1,0)) 

который выглядит следующим образом:

User Obs Flag 
1:  1 1 0 
2:  1 2 1 
3:  1 3 0 
4:  1 4 1 
5:  1 5 0 
6:  2 1 0 
7:  2 2 1 
8:  2 3 0 
9:  2 4 0 
10: 3 1 1 
11: 3 2 0 
12: 3 3 0 
13: 3 4 0 
14: 3 5 1 
15: 3 6 0 

То, что я хотел бы сделать с этим, чтобы получить максимальное наблюдение меньше текущего наблюдения, где флаг 1, от пользователя. Результат должен выглядеть так:

User Obs Flag min.max 
1:  1 1 0  NA 
2:  1 2 1  2 
3:  1 3 0  2 
4:  1 4 1  4 
5:  1 5 0  4 
6:  2 1 0  NA 
7:  2 2 1  2 
8:  2 3 0  2 
9:  2 4 0  2 
10: 3 1 1  1 
11: 3 2 0  1 
12: 3 3 0  1 
13: 3 4 0  1 
14: 3 5 1  5 
15: 3 6 0  5 

Любая помощь была бы принята с благодарностью!

ответ

3
t[, max := Obs[Flag == 1], by = .(User, cumsum(diff(c(0, Flag)) == 1))] 
t 
# User Obs Flag max 
# 1: 1 1 0 NA 
# 2: 1 2 1 2 
# 3: 1 3 0 2 
# 4: 1 4 1 4 
# 5: 1 5 0 4 
# 6: 2 1 0 NA 
# 7: 2 2 1 2 
# 8: 2 3 0 2 
# 9: 2 4 0 2 
#10: 3 1 1 1 
#11: 3 2 0 1 
#12: 3 3 0 1 
#13: 3 4 0 1 
#14: 3 5 1 5 
#15: 3 6 0 5 
+0

Он работает, спасибо! – giraffe

+0

Я подозреваю, что что-то с 'rleid' также будет работать, но не может проверить ... возможно' t [, m: = Obs [Flag == 1] [rleid (cumsum (Flag))], by = User] ' – Frank

+1

@Frank close - он работает, если вы просто замените 'cumsum (diff (...' с 'rleid (cumsum (...' in 'by') – eddi

Смежные вопросы