2016-04-01 3 views
0

У меня есть таблица данных, как это:Присвоение значений группы на основе предыдущих строк в R

ID Type 
    1 I 
    1 A 
    1 A 
    2 I 
    2 A 
    2 I 
    2 C 
    2 I 
    2 I 

Я хочу, чтобы добавить последовательность столбцов, как показано ниже:

ID Type Seq 
    1 I 1 
    1 A 1 
    1 A 1 
    2 I 1 
    2 A 1 
    2 I 2 
    2 C 2 
    2 I 3 
    2 I 4 

Логика:
= Seq previous_row_for_user_where_I_occurs +1, когда тип = I
Seq = предыдущая возникновение I для пользователя, если выбран тип = A или C

Так что в основном для данного номера пользователя все вхождения I последовательно. Если A или C происходит между ними, тогда присвойте ему значение I, которое происходит до него. Идентификаторы были отсортированы с использованием поля даты.

Я также ссылался на нижеследующее, но это не помогло, потому что, если «А» встречается дважды для пользователя, второе вхождение неправильно пронумеровано.
Assigning values in a sequence depending on previous row in R

Я использую цикл for, который занимает часы, поскольку у меня 10 миллионов строк.

+1

Параметр 'столбец type' отсутствует в первой таблице данных. Также ваша логика неясна для последующих повторений. Будет ли подсчет подсчета с 3,4, ... когда появятся более кратные числа? –

+0

Я внес изменения в исходный вопрос. –

ответ

3

Я думаю data.table пакет является лучшим вариантом для этой задачи:

> dt[, Seq := cumsum(Type == "I"), by = ID] 
> dt 
    ID Type Seq 
1: 1 I 1 
2: 1 A 1 
3: 1 A 1 
4: 2 I 1 
5: 2 A 1 
6: 2 I 2 
7: 2 C 2 
8: 2 I 3 
9: 2 I 4 
+0

Ваше решение работает только по совпадению, применяемому к примеру. Попробуйте добавить третий идентификатор. Например, '10: 3 I' –

+0

@PierreLafortune уточнить –

+0

Ваше решение сбрасывает последовательность до 0 после каждой группы. Но, возможно, это ожидаемый результат. ОП уточнит, если нет. –

0

Мы можем использовать dplyr

library(dplyr) 
df1 %>% 
    group_by(ID) %>% 
    mutate(Seq = cumsum(Type=="I")) 
+0

Спасибо за ответ. dplyr также решает мою цель, но занимает несколько секунд, чтобы работать с большим объемом данных. С другой стороны, команда data.table работает в мгновение ока. –

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